Estou usando o PHP 5.6.30 e fazendo algumas edições personalizadas de atributos em tags HTML. Eu me deparei com uma esquisitice e não sei o que fazer com isso, ou como contorná-lo. É melhor mostrado por um snippet de código:
$string = '<li><a href="#Interfaces">2 Interfaces</a></li>';
$pattern1 = '/(<a\s+[^>]*? href)/i';
$pattern2 = '/(<a\s+[^>]*?href)/i';
$replace = '[DETECTED: ""]';
echo "Using pattern 1: " . preg_replace($pattern1, $replace, $string) . "\n\n";
echo "Using pattern 2: " . preg_replace($pattern2, $replace, $string);
saída:
Using pattern 1: <li><a href="#Interfaces">2 Interfaces</a></li>
Using pattern 2: <li>[DETECTED: "<a href"]="#Interfaces">2 Interfaces</a></li>
Ele também não combina com '%(<a\s+[^>]*?\shref)%im'
(apenas no caso de espaço versus caractere de espaço em branco que é o problema).
Por que [^>]href
corresponde, mas [^>] href
e [^>]\shref
não? Logicamente, eles devem ter correspondência idêntica, pois o espaço corresponde a qualquer caractere [^ >], um espaço literal ou uma classe \ s.
OBSERVAÇÃO: simplifiquei o caminho da regex até o problema real; por favor, não pergunte "por que o RU faz dessa maneira", como o snippet não pretende mostrar ou explicar o código inteiro, apenas destaque a pequena parte que está falhando inesperadamente.