我如何加入这两个模式以适应单个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);
我需要这个模式一次找两件事
答案 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"))
//....
?>