границы слова preg_replace

Я хотел бы поймать любой фрагмент строки, который соответствует% [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, потому что перед знаком% есть граница.

Любая помощь будет принята с благодарностью.

0

Решение

Пытаться

/\B%[a-z0-9]+\b/

У вас нет граница слова \b между пространством и %, но у вас есть один между s а также %,

\B противоположность \b не граница слова.

Смотрите это здесь regex101

1

Другие решения

%[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]+
0

По вопросам рекламы [email protected]