Как правильно разбить эту строку

#php #string

#php #строка

Вопрос:

У меня есть строки, которые имеют следующий шаблон. Some text on some more text before some text .

Как мне найти

  • позиция слова «до» и удалить его с чем-либо после него,
  • и положение слова «вкл» и удалить его с чем-либо перед ним?

Комментарии:

1. Гарантированно ли, что слова before и on будут встречаться в ваших предметах только один раз?

2. @fireeyedboy да, только один раз, но только с пробелами вокруг них, такими как ` on`

3. И нужно ли также удалять пробелы вокруг них? Или только те, которые вокруг on ?

Ответ №1:

Регулярные выражения для этого излишни. Просто создайте подстроку из того места, где вы находите «on», туда, где вы находите «before»:

 $str = 'Some text on some more text before some text';

// Find " on "
$start = strpos($str, " on ");

// Check for errors
// Note the 3 ='s
if($start === FALSE) {
    // Error occurred, do something
}
$start  = 4; // Go after "on"

// Find " before "
$end = strpos($str, " before ", $start);

// Check for errors
// Note the 3 ='s
if($end === FALSE) {
    // Error occurred, do something
}

// Get just the part we want
$length = $end - $start;
$result = substr($str, $start, $end - $start);
  

Комментарии:

1. Сбой в консоли при тестировании перед другим тестом.

2. $ str = ‘Текст консоли в тексте перед текстом’; $ res будет «единственным текстом в тексте» (найденным в word cinsole), а не полным словом.

3. @RiaD Я добавил пробелы вокруг поисковых слов

Ответ №2:

 preg_match('~bonb(. )bbeforeb~',$text,$match);
//use $match[1]; e.g $text=$match[1];
  

Комментарии:

1. Я думал, что это правильно, но для этого нужны разделители и круглые скобки . . Затем используйте $match[1] для захвата текста.

Ответ №3:

рассмотрите возможность использования регулярных выражений:

 $text= "Some text on some more text before some text";
$pattern = '/^.* on(.*)before.*$/';

preg_match($pattern, $text, $matches);
if($matches) {
    print $matches[1];
}
  

Ответ №4:

Попробуйте это:

 <?php

$string = 'Some text on some more text before some text';

$newString = preg_replace('/(.*)on(.*)before(.*)/', '$2', $string);

echo $newString;
  

Регулярное выражение: http://regexr.com ?2uqq7

Демонстрация PHP: http://codepad.org/uXBL8IaA

Ответ №5:

     $var="Some text on some more text before some text";
preg_match('/bonb(.*)bbeforeb/',$var,$match);
//Edit: You can use `(. )` too if, by any chance, there is no text between 'on' and 'before'.
print_r ($match);
//$match[1] has "some more text"
  

Это то, что вы хотите?

а что касается позиции, вы можете echo strrpos($var, " on "); , если я правильно понял (как вы сказали в комментарии, что «вкл» имеет пробелы вокруг него. echo strrpos($var, "before"); кроме того, это вернет позицию первого символа.

Ответ №6:

 $str = 'Some text on some more text before some text';
$str = str_replace(array('on','before'), '', $str);
  

Комментарии:

1. Это просто удаляет слова «on» и «before» из $str. Результирующий текст будет «Некоторый текст, еще немного текста, немного текста»