Tenho uma sequência de texto e uma série de palavras:
String: Auch ein blindes Huhn findet einmal ein Korn.
Words: auch, ein, sehendes
Quero verificar qual das palavras está contida na string. Estou usando preg_match_all
para isso:
$pattern = "/\bauch\b|\bein\b|\bsehendes\b/i";
$subject = "Auch ein blindes Huhn findet einmal ein Korn.";
preg_match_all($pattern, $subject, $matches);
print_r($matches);
Array
(
[0] => Array
(
[0] => Auch
[1] => ein
[2] => ein
)
)
Isso funciona como esperado, mas como tenho que editar o padrão frequentemente, e acho confuso encontrar e substituir palavras quando todas elas estão cercadas por âncoras de limite de palavra ( \b
), gostaria de definir a lista de palavras sem as âncoras de limite de palavra e adicioná-las em uma segunda etapa. Algo como:
$pattern = "auch|ein|sehendes";
$pattern = "/\b" . $pattern . "\b/i";
Isso, é claro, não funciona como esperado.
Eu poderia preencher um array com as palavras e fazer um loop sobre ele para construir o padrão, mas gostaria de evitar loops. Alguma ideia de como fazer isso rápido? A string real e o número real de palavras são bem grandes.
Eventualmente preciso do número de correspondências, pois ele é retornado por preg_match_all
. Para o exemplo, a saída esperada é "3".
Aqui está uma pergunta semelhante onde isso é feito em Javascript: Aplique uma âncora de limite de palavra a todos os tokens em uma única expressão regular
Você pode usar uma alternância de palavras-chave, por exemplo
Nota: O
?:
interior da alternância(?...)
simplesmente diz ao PHP para desligar o grupo de captura. Não há nada de errado em deixar o grupo de captura ligado, mas não precisamos dele aqui, então é melhor não usá-lo.