regex oddity - por que isso não funciona e como combiná-lo?

0

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.

    
por Stilez 01.06.2017 / 10:37

1 resposta

1

Sua primeira expressão contém dois espaços obrigatórios entre <a e href , mas sua string tem apenas um

/(<a\s+[^>]*? href)/i - \s+ (um ou mais espaço em branco) e (exatamente um espaço) são necessários para corresponder

O segundo padrão contém apenas um espaço obrigatório.

    
por 01.06.2017 / 13:19

Tags