php regex (фильтр?) где регулярное выражение не должно использоваться

#php #regex

#php #регулярное выражение

Вопрос:

Возможно ли добавить «фильтр» со словами, которые, если найдены, регулярное выражение не разделяет слова? — Вау, я надеюсь, что мой английский имеет смысл 🙂

Позвольте мне проиллюстрировать..

Это мое текущее регулярное выражение для разделения строк, таких как: TheStringIsSItTING Together

 $taglist=preg_replace('/([a-z])([A-Z])/','$1 $2', $taglist);
  

С помощью строки примера регулярное выражение выдает: Строка находится в

Я хотел бы иметь фильтр, куда я мог бы поместить SItTING, чтобы регулярное выражение не разделяло это слово на части.

Пожалуйста, дайте мне знать, если мое объяснение было недостаточно хорошим, я все еще борюсь со своим английским 🙂

О, и спасибо за ОТЛИЧНОЕ сообщество!!

Ответ №1:

На самом деле вы не можете проверить, находитесь ли вы в середине слова, не разбивая это слово вручную с помощью поисковых утверждений, как это сделал @stema. Чтобы иметь список исключений, вам пришлось бы сделать это немного более программно.

 $taglist = 'TheStringIsNowCurrentlySItTING';
$excludeList = array(
    'SItTING',
    'StringIs',
);

$exclusions = implode('|', $excludeList);
$tagArr = preg_split("/($exclusions)/", $taglist, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach ($tagArr as amp;$token) {
    if (!in_array($token, $excludeList)) {
        $token = preg_replace('/([a-z])([A-Z])/', '$1 $2', $token);
    }
}
$taglist = implode(' ', $tagArr);
  
  1. Разбейте его на части на ваших исключенных условиях.
  2. Ставьте пробелы только в терминах, которые не исключены.
  3. Склейте все обратно с пробелами.

Комментарии:

1. идеально подходит для моих нужд! не думал о том, чтобы сделать это более программным способом. Большое спасибо!

Ответ №2:

Вы имеете в виду что-то вроде этого

 ([a-z])(?<!Slt)(?!TING)([A-Z])
  

Смотрите это здесь, в Regexr

Эта часть (?<!Slt)(?!TING) представляет собой комбинацию отрицательного взгляда сзади и отрицательного предвидения. Они проверяют в этой позиции между строчной и прописной буквами, что слева нет «Slt» или «TING» справа.

Но будьте осторожны, оно также не будет соответствовать

Строка имеет значение SItFOO
Строка имеет значение Footing ==> Строка имеет значение FooTING

буквы не разделяются, как только один из поисковых путей завершается неудачей.

Смотрите здесь о Regexr