изменить регулярное выражение, чтобы выбрать все символы, только если оно не содержит строку - PullRequest
0 голосов
/ 19 марта 2020

Исходное регулярное выражение:

<div class="msgln"(.*?)</div>

Я пытаюсь отредактировать это регулярное выражение так, чтобы оно выбирало только те «строки», которые соответствуют этому шаблону:

(begining literal string), за которым следует (any number of characters if they don't contain a specific string) сопровождаемый (ending literal string)

наиболее часто встречаемым я нашел ^((?!(cat|dog)).)*$, но, похоже, он не работает, если я не правильно его использую.

Пример:

<?php
$phpString = '<div class="msgln" a="dog" b="cat">stuff here</div>
<div>just another line</div>
<div class="msgln" a="another" b="one">stuff here</div>';

$phpString = preg_replace('~<div class="msgln"(.*?)</div>~i', "", $phpString);
?>

в примере я пытаюсь выбрать только первую «строку» в строке с cat|dog, но не третью с another|one. Исходное регулярное выражение выше выбирает обе строки div с class="msgln", как и ожидалось (игнорируя среднюю линию div), поэтому я пытаюсь изменить часть (.*?), чтобы выбрать только строку с кошкой или собакой в ​​ней.

Я посмотрел, но не могу найти решение, которое работает. Предыдущие поиски имеют несколько общих предложений, таких как приведенный выше, но ни один из них не работает.

Я нашел это

(.*)(?=(dog|cat))(.*)

, который выбирает строку, но пытается использовать отрицательный, чтобы выбрать все остальные

(.*)(?!=(dog|cat))(.*)

не работает (с и без =), имеет тот же эффект, что и оригинал

(.*?)

Некоторая информация:

  • Работа с PHP
  • Нет базы данных, нужно работать с плоскими файлами
  • Нужно сделать несколько других вещей со строкой, которая может стать причиной большого сбоя. Regex значительно ускоряется на основе данных испытаний

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Что делает шаблон ^((?!(cat|dog)).)*$, так это позиционирует начало строки ^ и проверяет, не содержит ли строка cat или dog. ((?!foo) - это негативный взгляд). В этом случае он начнет сопоставлять действительные символы (.)* от начала строки до конца $.

В вашем сценарии, если вы хотите сопоставить строку, которая не (!) содержат слова «другой» или «один», просто измените слова: ^((?!(another|one)).)+$. Обратите внимание, что я изменил * (ноль или более) в конце на + (один или несколько), потому что с первым возможно, что шаблон соответствует пустым строкам нулевой длины, что может вызвать проблемы:).

0 голосов
/ 24 марта 2020

Обновление:

Основываясь на предложении gjzwiers, здесь приведено последнее регулярное выражение, которое работает (PHP preg_replace)

$data = preg_replace('~<div class="msgln"((?!(dog|cat)).)+</div>~im', "", $data);

Я забыл о флаг 'm'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...