簡體   English   中英

將兩種模式合二為一preg_match_all

[英]join two patterns in one preg_match_all

如何結合這兩種模式以適合單個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);

我需要模式一次查找兩件事

盡管有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>
preg_match_all("/(<span[^>]*(?:(?:annot|value=.?(\w*).?)|(?:value=.?(\w*).?|annot))[^>]*>)(.*?)<\/span>/", $text, $matches, PREG_OFFSET_CAPTURE);

無論如何,我建議您改用PHP [Document Object Model] [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"))

            //....
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM