正则表达式奇怪之处-为什么它不起作用以及如何匹配它?

正则表达式奇怪之处-为什么它不起作用以及如何匹配它?

我正在使用 PHP 5.6.30,并对 HTML 标签进行一些自定义属性编辑。我遇到了一个奇怪的问题,不知道该怎么做,或者如何解决它。最好通过代码片段来展示:

$string = '<li><a href="#Interfaces">2 Interfaces</a></li>';

$pattern1 = '/(<a\s+[^>]*? href)/i';
$pattern2 = '/(<a\s+[^>]*?href)/i';
$replace = '[DETECTED: "\1"]';

echo "Using pattern 1: " . preg_replace($pattern1, $replace, $string) . "\n\n";
echo "Using pattern 2: " . preg_replace($pattern2, $replace, $string);

输出:

Using pattern 1: <li><a href="#Interfaces">2 Interfaces</a></li>

Using pattern 2: <li>[DETECTED: "<a href"]="#Interfaces">2 Interfaces</a></li>

它也不匹配'%(<a\s+[^>]*?\shref)%im'(以防万一是空格与空白字符的问题)。

为什么[^>]href匹配但[^>] href又不[^>]\shref匹配?从逻辑上讲,它们应该具有相同的匹配性,因为空格与 [^>] 字符、文字空格或 \s 类中的任何一个匹配。

注意:我已经将正则表达式简化为实际问题;请不要问“为什么你这样做”,因为该代码片段并非旨在显示或解释整个代码,只是突出显示意外失败的小部分。

答案1

<a您的第一个表达式在和之间包含两个必需空格href,但您的字符串只有一个

/(<a\s+[^>]*? href)/i- \s+(一个或多个空格)和(至少一个空格)都需要匹配

第二种模式只包含一个必需空格。

相关内容