0

如何加入这两种模式以适应单个 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);

我需要模式同时查找两件事

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 回答