-4

要件があります。たとえば、次の値を持つ文字列があります。

<p>We are pleased <a href="http://www.anc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html">to present the new product type</a>. This new product type is the best thing since sliced bread. We are pleased to present the new product type. This new product <a href="mailto:abc@gmail.com">type is the best</a> thing since sliced bread.</p>

上記のテキストは、単一の文字列値として保存されます。基準を確認した後、特定のパラメーターを href に追加する必要があります。hrefのみを抽出してパラメータを追加し、文字列を傷めずに表示する方法を教えてください(参考:文字列はRTE - リッチテキストエディタで入力した値です)

このアプローチを試みましたが、成功しませんでした。

String tmpStr = "href=\"http://www.abc.com\">design";

StringBuffer tmpStrBuff = new StringBuffer();
String[] tmpStrSpt = tmpStr.split(">");
if (tmpStrSpt[0].contains("abc.com")) {
    String[] tmpStrSpt1 = tmpStrSpt[0].split("\"");
    tmpStrBuff.append(tmpStrSpt1[0]);
    if (tmpStrSpt1[1].contains("?")) {
        tmpStrBuff.append("\"" + tmpStrSpt1[1] + "&s_cid=abcd_xyz\">");
    } else {
        tmpStrBuff.append("\"" + tmpStrSpt1[1] + "?s_cid=abcd_xyz\">");
    }
    tmpStrBuff.append(tmpStrSpt[1]);
    tmpStrBuff.append("</a>");
    System.out.println(" <p>tmpStr1:::: " + tmpStrBuff.toString() + "</p>");
}

使用される他のアプローチは次のとおりです。

String[] tmpTxtArr = text.split("\\s+");
StringBuffer tmpStrBuff = new StringBuffer();
for (String tmpTxt : tmpTxtArr) {
    descTxt += (tmpTxt.contains("abc.com") && !tmpTxt.contains("?")) ? tmpTxt
            .replace("\">", "?s_cid=" + trackingCode + "\">" + " ")
            : tmpTxt + " ";
}
4

1 に答える 1

2

説明

この正規表現は次のようになります。

  1. アンカータグで href 属性を見つける
  2. href に が必要ですhttp://abc.com。また、それぞれの位置でhttpsandを許可します。www.abc.com
  3. 文字列に が含まれている場合、?それもキャプチャされ、グループ キャプチャ 3 に配置されます。

<a\b[^<]*\bhref=(['"])(https?:\/\/(?:www[.])?abc[.]com[^"'?]*?([?]?)[^"'?]*?)\1[^<]*<\/a>

ここに画像の説明を入力

グループ

グループ 0 には、開始から終了までのアンカー全体が含まれ<aます</a>。これが過剰である、またはネストされたアンカー タグと衝突することがわかった場合は[^<]*<\/a>、この式の末尾から を削除してください。

  1. で後で逆参照されるオープン クォートを取得し\1て、同じクローズ クォートがあることを確認します
  2. href 値を取得します
  3. 疑問符があった場合は、ここにキャプチャされます

Java コード例:

与えられたサンプル テキスト:

<p>Some <a href="http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html">text</a>. I like kittens <a href="mailto:abc@gmail.com">email us</a>Dogs are nice.</p><a href="http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html?attribute=value">remember to vote</a>

このコード

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "source string to match with pattern";
  Pattern re = Pattern.compile("<a\\b[^<]*\\bhref=(['\"])(https?:\\/\\/(?:www[.])?abc[.]com[^\"'?]*?([?]?)[^\"'?]*?)\\1[^<]*<\\/a>",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
  Matcher m = re.matcher(sourcestring);
  int mIdx = 0;
    while (m.find()){
      for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
        System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
      }
      mIdx++;
    }
  }
}

収量

$matches Array:
(
    [0] => Array
        (
            [0] => <a href="http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html">text</a>
            [1] => <a href="http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html?attribute=value">remember to vote</a>
        )

    [1] => Array
        (
            [0] => "
            [1] => "
        )

    [2] => Array
        (
            [0] => http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html
            [1] => http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html?attribute=value
        )

    [3] => Array
        (
            [0] => 
            [1] => ?
        )

)

ここから、グループ 3 に値がある場合は、すべての一致を繰り返すだけです。値が&ない場合は?、新しいテキストとグループ 2 の href 値の間に a を挿入します。

免責事項

HTML を正規表現で解析することは、長期的に維持するのが最も簡単なことではないかもしれません。ただし、入力テキストを制御できる場合、テキストはほとんど単純なままであり、正規表現が失敗する可能性がある定期的なエッジケースを喜んで使用し、正規表現が機能します。

一部の嫌いな人は、次のような文字列は正しく一致しないと指摘します。真実ではありますが、HTML ではこれらの可能性は違法または非現実的であるため、遭遇する可能性は低いです。

  • <a href="http://abc.com?attrib=</a>">link</a>余分な特殊記号< /であり>、HTML で機能するには、エスケープする必要があります。ここに示すように、これは HTML 標準に違反します。
  • <a href="http://abc.com?attrib=value">outside<a href="http://abc.com?attrib=value2">inside</a></a>ネストされたリンクは合法かもしれませんが、ブラウザにどのアンカータグをたどるかを選択させます。この形式が使用されているのは見たことがありません。
于 2013-06-08T14:45:14.043 に答える