Я использую 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 делает это таким образом", так как фрагмент не предназначен для показа или объяснения всего кода, просто выделите небольшую часть, которая неожиданно перестала работать.