Найти все буквенно-цифровые строки за период

Как получить все строки между не алфавитно-цифровым или подчеркиванием и точкой? Например, для приведенной ниже строки, получить [sources_1st,sources], https://stackoverflow.com/a/10596688/1032531 был похожий вопрос, но, похоже, не работает для меня.

<?php

function check($pattern,$str)
{
echo($pattern.'<br>');
preg_match($pattern, $str, $matches);
echo('<pre>'.print_r($matches,1).'</pre>');
}
$str='fullname("protocol",coalesce(sources_1st.protocol,sources.protocol))';
echo($str.'<hr>');

check('/[^.]+\.[^.]+$/',$str);
check('/[\w]\..*$/',$str);
check('/[^\w]\..*$/',$str);
check('/\w\..*$/',$str);
check('/\w+(?=.*\.)$/',$str);
check('/\w+(?=.*\\.)$/',$str);
check('/\b[^ ]+\.$/',$str);
check('/\b[^ ]+\\.$/',$str);
check('/.*?(?=\.)$/',$str);

Выход:

fullname("protocol",coalesce(sources_1st.protocol,sources.protocol))
--------------------------------------------------------------------------------
/[^.]+\.[^.]+$/

Array
(
[0] => protocol,sources.protocol))
)

/[\w]\..*$/

Array
(
[0] => t.protocol,sources.protocol))
)

/[^\w]\..*$/

Array
(
)

/\w\..*$/

Array
(
[0] => t.protocol,sources.protocol))
)

/\w+(?=.*\.)$/

Array
(
)

/\w+(?=.*\.)$/

Array
(
)

/\b[^ ]+\.$/

Array
(
)

/\b[^ ]+\.$/

Array
(
)

/.*?(?=\.)$/

Array
(
)

0

Решение

Используя приведенное ниже регулярное выражение, вы можете сопоставить символы слова между несловесным символом и точкой:

\W\K\w+(?=\.)

Живая демо

Объяснение:

  1. \W соответствовать не состоящему из символов
  2. \K выбросить предыдущий матч
  3. \w+(?=\.) любое слово символов до точки

Код PHP:

preg_match_all('~\W\K\w+(?=\.)~', $str, $matches)
2

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector