Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как свести условия в одно РВ?
Форумы портала PHP.SU » PHP » Регулярные выражения » Как свести условия в одно РВ?

Страниц (1): [1]
 

1. Perun - 22 Февраля, 2021 - 15:46:23 - перейти к сообщению
Можно ли отловить одним рв без захвата?

^wordone|wordtwo|wordthree(
\^wordone|wordtwo|wordthree(
+wordone|wordtwo|wordthree(
(wordone|wordtwo|wordthree(


Первый вариант- ^ - это с начала строки
Нужно отлавливать только слово. Либо wordone, либо wordtwo либо wordthree. Без скобок и операторов. Это слово может быть только в начале или в середине строки.
2. Perun - 22 Февраля, 2021 - 17:58:33 - перейти к сообщению
Похоже, без захвата это не делается, оставил пока так:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. "[+^(](wordone|wordtwo|wordthree)\("
  3.  


Из той же оперы, регулярка ищет вхождение. которого в строке быть не должно:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. ".*[a-zA-Z|0-9]+\(.*"
  3.  


как тут исключить (wordone|wordtwo|wordthree)?
Т.е. эти слова могут быть перед открывающей скобкой
Как это исключение добавить в набор?
3. dcc0 - 24 Февраля, 2021 - 01:14:59 - перейти к сообщению
Cut
4. Perun - 27 Февраля, 2021 - 22:42:14 - перейти к сообщению
dcc0 пишет:
Попробую перевести в human readable: отрицание трёх слова, затем ваше правило

не совсем праильно.

РВ должно обнаруживать любую последовательность только из букв [a-zA-Z]
кроме целых слов: wordone, wordtwo и wordthree

например: входная строка -> есть совпадение или нет

wordonet -> true
networdone -> true
12test -> false
wordtwo -> false
testwordonetest -> true
wordonewordtwo -> true
word/three -> false
wordone12 -> false
qwertY -> true
a -> true
000 -> false
/ -> false
AAZZ -> true
5. dcc0 - 28 Февраля, 2021 - 18:09:26 - перейти к сообщению
Я там выше неправильно написал. Может быть, и не получится в один проход.
(Сильно торможу). отрицание слова делается так:

Соответственно трудно уместить в одно выражение любые буквенные символы и исключить три слова.
Поэтому могу предложить только сделать предварительный фильтр.
6. dcc0 - 01 Марта, 2021 - 13:30:00 - перейти к сообщению
Можно попытаться использовать положительный или/и отрицательный просмотр назад и вперёд:
PHP:
скопировать код в буфер обмена
  1.  
  2.                 $string = "wordone hello world";
  3.                 preg_match_all("/(?<=wordone)[\sa-zA-Z0-9\s]+(?=world)/u", $string, $match);
  4.                 print_r($match);
  5.  

Но надо до конца понимать, как выглядят строки.
(Добавление)
Или фильтр наподобие такого:
Спойлер (Отобразить)
7. Vladimir Kheifets - 02 Марта, 2021 - 11:56:19 - перейти к сообщению
Perun пишет:
dcc0 пишет:
Попробую перевести в human readable: отрицание трёх слова, затем ваше правило

не совсем праильно.

РВ должно обнаруживать любую последовательность только из букв [a-zA-Z]
кроме целых слов: wordone, wordtwo и wordthree

например: входная строка -> есть совпадение или нет

wordonet -> true
networdone -> true
12test -> false
wordtwo -> false
testwordonetest -> true
wordonewordtwo -> true
word/three -> false
wordone12 -> false
qwertY -> true
a -> true
000 -> false
/ -> false
AAZZ -> true


Добрый день!
Код:
Спойлер (Отобразить)

Результ:
Цитата:
pattern:
/(?=^[[:alpha:]]+$)(?!^(wordone|wordtwo|wordthree)$)/

wordonet -> true
networdone -> true
12test -> false
wordone -> false
wordtwo -> false
wordthree -> false
testwordonetest -> true
wordonewordtwo -> true
word/three -> false
wordone12 -> false
qwertY -> true
a -> true
000 -> false
/ -> false
AAZZ -> true
Удачи!

 

Powered by ExBB FM 1.0 RC1