#php #regex #arrays #string
#php #регулярное выражение #массивы #строка
Вопрос:
$str = 'foooo'; // <- true; how can I get 'foo' 'oo' ?
$words = array(
'foo',
'oo'
);
Какой самый быстрый способ я мог бы узнать, $str
начинается ли с одного из слов из массива, и разделить его, если это так?
Ответ №1:
Используя $words
и $str
из вашего примера:
$pieces = preg_split('/^('.implode('|', $words).')/',
$str, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
Результат:
array(2) {
[0]=>
string(3) "foo"
[1]=>
string(2) "oo"
}
Комментарии:
1. Спасибо! Вы знаете, как я могу сделать то же самое, но в обратном порядке? Я имею в виду проверить, заканчивается ли строка одним из слов
2. @Alex, это должно сработать, если вы удалите
^
(маркер начала строки) и замените его на$
(маркер конца строки) перед окончательным/
:'/('.implode('|', $words).')$/'
Ответ №2:
Попробуйте:
<?php
function helper($str, $words) {
foreach ($words as $word) {
if (substr($str, 0, strlen($word)) == $word) {
return array(
$word,
substr($str, strlen($word))
);
}
}
return null;
}
$words = array(
'foo',
'moo',
'whatever',
);
$str = 'foooo';
print_r(helper($str, $words));
Вывод:
Array
(
[0] => foo
[1] => oo
)
Ответ №3:
Это решение выполняет итерацию по $words
массиву и проверяет, начинается ли $str
с каких-либо слов в нем. Если он находит совпадение, он сокращается $str
до $w
и прерывается.
foreach ($words as $w) {
if ($w == substr($str, 0, strlen($w))) {
$str=$w;
break;
}
}
Ответ №4:
string[] MaybeSplitString(string[] searchArray, string predicate)
{
foreach(string str in searchArray)
{
if(predicate.StartsWith(str)
return new string[] {str, predicate.Replace(str, "")};
}
return predicate;
}
Для этого потребуется перевод с C # на PHP, но это должно указать вам правильное направление.