0

これら 2 つのパターンを結合して単一の preg_match_all に適合させる方法: 私はこれを持っています:

preg_match_all("/(<span[^>]*annot[^>]*value=.?(\w*).?[^>]*>)(.*?)<\/span>/", $text, $matches, PREG_OFFSET_CAPTURE);

この:

preg_match_all("/(<span[^>]*value=.?(\w*).?[^>]*annot[^>]*>)(.*?)<\/span>/", $text, $matches, PREG_OFFSET_CAPTURE);

一度に 2 つのものを探すパターンが必要です

4

2 に答える 2

3

HTMLの一致にもかかわらず、これを試してください:

preg_match_all("/((<span[^>]*annot[^>]*value=.?(\w*).?[^>]*>)(.*?)<\/span>|(<span[^>]*value=.?(\w*).?[^>]*annot[^>]*>)(.*?)<\/span>)/", $text, $matches, PREG_OFFSET_CAPTURE);

これらは、次のorような演算子を介して結合されます。

(exp1|exp2)

編集: "annot= value=" と "value= annot=" を一致させて、何をしようとしているのか理解できたら、代わりにこの正規表現を使用できます (何も台無しにしていないことを願っていますが、アイデアを得る必要があります):

(<span[^>]*(value=.?(\w*).?[^>]*|annot[^>]*)>)(.*?)<\/span>
于 2013-01-21T18:14:15.417 に答える
2
preg_match_all("/(<span[^>]*(?:(?:annot|value=.?(\w*).?)|(?:value=.?(\w*).?|annot))[^>]*>)(.*?)<\/span>/", $text, $matches, PREG_OFFSET_CAPTURE);

とにかく、代わりに PHP [ドキュメント オブジェクト モデル][1] を使用することをお勧めします。HTML データを解析するために正規表現を使用することは非常に推奨されていません。

<?PHP

   $DOM = new DOMDocument;
   $DOM->loadHTML($HTML);

   $items = $DOM->getElementsByTagName('span');

   foreach ($items as $item)
   {
       foreach ($item->attributes as $attribute)
       {
           if (($attr->nodeName == "name") && ($attr->nodeName == "annotation"))

            //....
?>
于 2013-01-21T18:17:16.633 に答える