在一个preg_match_all中连接两个模式

时间:2013-01-21 17:51:55

标签: php string pattern-matching preg-match 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);

我需要这个模式一次找两件事

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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"))

            //....
?>