PHP preg_replace() Оставить только слова в верхнем регистре

Как я могу оставить только слова в верхнем регистре, цифры, спецсимволы или слова, где первая буква в верхнем регистре, но содержит не более 3-х символов, с preg_replace.

Например:

Portocjnk Karaer HDS-C 7/11, 9/15, 8/15-E => HDS-C 7/11, 9/15, 8/15-E< /эм>

Karcher Karcher B 140 R Bp => B 140 R Bp

Karcher Karcher B 140 R Bsp Trr => B 140 R Bsp Trr

Tatata Tatat Yard-Man YM 84 M-W 31AY97KV643 => YM 84 M-W 31AY97KV643

(Tatata) (Tatat) Yard-Man YM 84 M-W 31AY97KV643 => YM 84 M-W 31AY97KV643

Заранее спасибо.


person DreifGenov    schedule 28.02.2011    source источник
comment
Как вы можете сказать, что буква «В» в «Karcher B» является частью обязательного сохранения, а не просто чьим-то инициалом?   -  person Marc B    schedule 28.02.2011
comment
Если за ним не следует строчная буква, я думаю.   -  person DreifGenov    schedule 28.02.2011
comment
Я думаю, что это достаточно сложная проблема, поэтому вам следует разобрать ее самостоятельно, а не отдавать на откуп функциям preg_*. Если вы в конечном итоге сделаете это, вам нужно preg_match_all, а не preg_replace. preg_replace берет заданное регулярное выражение и удаляет совпадающее. Вы начинаете с того, что хотите совместить. Поэтому вы должны использовать совпадение, а не замену.   -  person Billy ONeal    schedule 28.02.2011
comment
Не могли бы вы уточнить, что вы подразумеваете под специальными символами?   -  person Billy ONeal    schedule 28.02.2011
comment
Что не сработало со вчерашним ответом? stackoverflow.com/questions/5133133/< /а>   -  person mario    schedule 28.02.2011
comment
@mario, вчера мы искали слова в нижнем регистре или с первой буквой в верхнем регистре. Но лучше искать в верхнем регистре. Или как мне улучшить вчерашние ответы, чтобы исключить такие слова, как (Татат), Дворовик, а тем более мне нужно исключить русские символы. Так что, как я вижу, лучше искать в верхнем регистре.   -  person DreifGenov    schedule 28.02.2011
comment
Вы можете добавить \(? до и ) в классы персонажей [a-z..], чтобы включить их. И вы можете использовать \p{Cyrillic} для соответствия русским буквам. Но правда, теперь подход с использованием белого списка может быть проще. Добавьте пример русских строк.   -  person mario    schedule 28.02.2011
comment
@Марио, Cнегоуборочная машина "MTD" E740 F, Тратата (аэратор) бензиновый "Yard-Man" YM 3516 VO #40CM MTD, Cнегоуборочная машина MTD M 53.   -  person DreifGenov    schedule 28.02.2011


Ответы (2)


preg_replace('|\b([A-Z][a-z][a-z][a-z][a-z\-]*)\b|','',$text);

этот будет работать с большей частью вашего примера

person hackerone    schedule 28.02.2011

Это был бы упрощенный подход к белому списку. Вместо preg_replaceing сначала будут извлечены нужные части. И после этого необходимо повторно объединить массив $result.

preg_match_all('#\b[A-Z\d][A-Z\d/,-]*\b|\b(?<!-)[A-Z][a-z]{1,2}\b#', $str, $result);
$result = implode(" ", $result[0]);

Возможно, вам потребуется добавить еще несколько «специальных» символов во второй класс символов [...].

Проверьте https://stackoverflow.com/questions/89718/is-there-something-like-regexbuddy-in-the-open-source-world, где вы найдете полезные инструменты, которые могут помочь в разработке регулярных выражений.

person mario    schedule 28.02.2011
comment
Спасибо! Это работает, но удаляется из строки. Tralala kulala "MTD" E740 F => MTD E740 F, а должно быть Tralala kulala "MTD" E740 F => "MTD" E740 F. - person DreifGenov; 28.02.2011