0

私のサイトには、検索結果で検索クエリが強調表示される機能があります。ただし、サイトが検索した一部のフィールドにはHTMLが含まれています。たとえば、で構成される検索結果があったとし<span>Hello all</span>ます。ユーザーが文字を検索した場合、今返される厄介なコードではなくa、コードを返してほしい。<span>Hello <mark>a</mark>all</span><sp<mark>a</mark>n>Hello <mark>a</mark>ll</sp<mark>a</mark>n>

でネガティブルックビハインドとルックアヘッドを使用して、がaと。の間にあるpreg_replace()インスタンスを除外できることを知っています。しかし、どうすればそれを行うことができますか?正規表現は私の弱点の1つであり、その効果を思い付くことができないようです。a<>

これまでのところ、私が持っているのはこれです:

$return = preg_replace("/(?<!\<[a-z\s]+?)$match(?!\>[a-z\s]+?)/i", '<mark>'.$match.'</mark>', $result);

しかし、それは機能していないようです。何か助けはありますか?

4

2 に答える 2

1

正規表現を使用する場合は、単純な否定的な先読みが必要です(タグなし、タグ内、またはタグ間にある整形式のマークアップを想定)<>

$return = preg_replace("/$match(?![^<>]*>)/i", '<mark>$0</mark>', $result);

の特別な正規表現文字は、$match適切にエスケープする必要があります。

于 2013-03-20T15:10:50.413 に答える
1

HTMLのような複雑な言語を解析するために正規表現を使用することは悪い習慣と考えられています。十分なスキルと忍耐力、および高度な正規表現エンジンがあれば、それは可能かもしれませんが、潜在的な落とし穴は巨大であり、パフォーマンスは良くない可能性があります。

より良い解決策は、PHPの組み込みDOMDocumentクラスなどのdomパーサーを使用することです。

この良い例は、この関連するSOの質問への回答にあります

お役に立てば幸いです。

于 2013-03-20T16:27:18.920 に答える