Совпадение кратных

Мне нужно сопоставить следующее, используя preg_match()

cats and dogs
catsAndDogs
i like cats and dogs

и т. д., поэтому я просто удалил пробелы, перевел их в нижний регистр и использовал это как шаблон в preg_match();

'/catsanddogs/i'

Но теперь мне также нужно сопоставить следующее:

cats+and+dogs
cats_and_dogs
cats+and_Dogs

Итак, есть ли быстрый и простой способ заменить строку несколько раз, кроме ее вложения? Я хочу, чтобы в конечном итоге с тем же шаблоном, чтобы соответствовать.

Спасибо.


person Chris J Allen    schedule 04.10.2010    source источник
comment
Хм, извините, я совсем не понимаю, что именно вы хотите выполнить, но в любом случае preg_replace_callback не поможет?   -  person Hannes    schedule 04.10.2010
comment
@ Ханнес, я думаю, что комбинация вашего предложения и обновления регулярного выражения на что-то вроде '/cats(\+|_)?and(\+|_)?dogs/i' будет работать   -  person Ryan Berger    schedule 04.10.2010


Ответы (3)


попробуйте это выражение '/cats([+_-])?and([+_-])?dogs/i'

редактировать: только что увидел, что вам не нужен + после «и», когда у вас уже есть + перед «и». Если это так, то вы должны использовать это выражение:

'/cats(\+and\+|\+and_|_and_|and)dogs/i'

person ITroubs    schedule 04.10.2010

Я бы пошел с ответом @ITroubs в этой ситуации, однако вы можете сделать несколько символов/строк замены на strtr следующим образом:

$trans = array(' ' => '','+' => '','-' => '', '_' => '');
$str = 'cats+and_dogs';
echo strtr($str, $trans); // prints: catsanddogs

Внимательно прочитайте документацию перед использованием.

person rojoca    schedule 04.10.2010

Хорошо, я не думаю, что вы четко определили свои правила соответствия, но вот моя упрощенная версия:

(c|C)ats([+_ ][aA]|A)nd([+_ ][dD]|D)ogs

Вероятно, вы хотите быть нечувствительным к регистру, потому что использовали /i в своем шаблоне, но я хотел бы добавить еще один подход.

Основные отличия - по сравнению с другими ответами - это части выражения для границы слов. Я использую [+_ ][aA]|A, чтобы регулярное выражение соответствовало 'cats and' или 'catsAnd', но не 'catsand'. Итак, суть в том, что я буду сопоставлять текст верблюжий регистр, только если между ними нет пробела.

person splash    schedule 04.10.2010