我正在尝试捕捉以下模式:
<a href="http://cdn.xyz.com/media/info.pdf" target="_blank">
这就是我正在尝试的:
preg_match_all( '/(<[a-zA-Z]+[^>]+>)/ism', $str, $matches);
这并未捕获上述模式。
我该如何重构模式?
您可以使用基于正则表达式的否定前瞻断言。
preg_match_all('~<[a-zA-Z]+(?:(?!&[lg]t;).)*>~isg', $str, $matches);
(?:(?!&[lg]t;).)*
匹配任何字符,但不匹配 <
或 >
的字符。也就是说,它检查要匹配的字符是否不是 <
或 >
中的起始字母。
或
<[a-zA-Z]+.*?>
(<[a-zA-Z]+.+?>)
您可以使用这个简单的模式。请参阅演示。
https://regex101.com/r/bW3aR1/14
你的正则表达式包含
[^>]+
,这不是你想象的那样。它只是一类不应该出现的字符。这里没有定义顺序。