Проверьте, начинается ли строка с определенных слов, и разделите ее, если это

#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, но это должно указать вам правильное направление.