1

以下のコードで達成したいこと:指定された単語の大文字と小文字を区別せず、テキスト内で1回だけ一致させ、それをリンクに置き換えます。

文字列内の「foo」という単語に一致する次の preg_match があります。

if (preg_match("/\bfoo\b/i", $text, $results, PREG_OFFSET_CAPTURE)) { 
  // substr_replace the word 'foo' for a link <a href.. 
}

HTML のないテキストでは問題ありませんが、HTML を含む次のテキストを想像してください。

Lorem ipsum dolor sit amet, <a href="/foo-bar/" title="foo bar">some other foo link</a> consectetur adipiscing elit foo bar.

この場合、現在のリンク内に新しいリンクが作成されます。これは、href 部分で foo と一致するためです (タイトルと名前の部分についても同じ問題です)。

HTML ステートメントの外側の 'foo' のみに一致するようにパターンを変更するにはどうすればよいですか?

4

2 に答える 2

3

HTML を正規表現で解析しないでください。代わりにXPathを使用してください。PHP はこれを簡単に利用できます。

必要なものの XPath 式は非常に単純です。内部で検索したいタグが であると仮定するとdiv、これはあなたが望むものです:

//div/text()[contains(.,'foo')]

テキスト ノードを取得したら、HTML タグが含まれていることを心配することなく、正規表現を実行できます。

于 2009-12-23T14:11:12.693 に答える
0

これまでに遭遇した左括弧と右括弧の数を数えることができます。それらが異なる場合、それは閉じ括弧に遭遇する前に括弧を開いたということを意味します。つまり、現在 HTML タグの中にいるということです。

ただし、一般に、HTML の解析に正規表現を使用するのは危険な考えであることに注意してください。

于 2009-12-23T14:11:41.727 に答える