Я хотел бы поймать любой фрагмент строки, который соответствует% [a-z0-9], с учетом следующих примеров:
1. %xxxxxxxxxxxxx //match
2. this will work %xxxxxx but not this%xxxxxxxxx. //match 1st, not 2nd
3. and also %xxxxxxxxxx. //match
4. just a line ending with %xxxxxxxxxxx //match
5. %Xxxxxxxxxxx //no match
6. 100% of dogs //no match
7. 65%. Begining of new phrase //no match
8. 65%.Begining of new phrase //no match
Это может быть в начале строки или в конце, но не в середине слова. Конечно, он может быть в строке как слово (разделенное пробелом).
я пытался
/(\b)%[a-z0-9]+(\b)/
/(^|\b)%[a-z0-9]+($|\b)/
/(\w)%[a-z0-9]+(\w)/
и другим, как это, но я не могу заставить его работать так, как я бы. Я думаю, что токен \ b не работает в примере 2, потому что перед знаком% есть граница.
Любая помощь будет принята с благодарностью.
Пытаться
/\B%[a-z0-9]+\b/
У вас нет граница слова \b
между пространством и %
, но у вас есть один между s
а также %
,
\B
противоположность \b
не граница слова.
Смотрите это здесь regex101
%[a-z0-9]+(?=\s|$)|(?:^|(?<=\s))%[a-z0-9]+
Попробуйте это. См. Демо.
https://regex101.com/r/iS6jF6/20
$re = "/%[a-z0-9]+(?=\\s|$)|(?:^|(?<=\\s))%[a-z0-9]+/m";
$str = "1. %xxxxxxxxxxxxx //match\n2. this will work %xxxxxx but not this%xxxxxxxxx. //match 1st, not 2nd\n3. and also %xxxxxxxxxx. //match\n4. just a line ending with %xxxxxxxxxxx //match\n5. %Xxxxxxxxxxx //no match\n6. 100% of dogs //no match\n7. 65%. Begining of new phrase //no match\n8. 65%.Begining of new phrase //no match";
preg_match_all($re, $str, $matches);
или же
%[a-z0-9]+\b|\b%[a-z0-9]+