Я использую 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 - нет? Логически они должны иметь одинаковое совпадение, так как пробел соответствует любому из [^>] char, литеральному пробелу или классу \s.

ПРИМЕЧАНИЕ: я упростил регулярное выражение до самой проблемы; пожалуйста, не спрашивайте "почему RU делает это таким образом", так как фрагмент не предназначен для показа или объяснения всего кода, просто выделите небольшую часть, которая неожиданно перестала работать.

1 ответ1

1

Ваше первое выражение содержит два обязательных пробела между <a и href , но в вашей строке только один

/(<a\s+[^>]*? href)/i - \s+ (один или несколько пробелов) и (точно один пробел) оба должны совпадать

Второй шаблон содержит только один обязательный пробел.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .