preg replace — PHP удаляет слово сразу после другого в строке

Я кодирую поисковую систему. В основном, если определенное слово встречается, мне нужно, чтобы слово сразу после этого слова было захвачено и удалено.

Если слово «йога» встречается, мне нужно удалить слово сразу после него, здесь «маты». Так что я бы получил:

$sentence="I like yoga mats a lot.";
$word="mats";
$result=I like yoga a lot.

Я посмотрел на strpos, но нужно это слово. У меня также есть preg_split для удаления слов по имени, но мне также нужно удалить это конкретное слово по позиции.

$separate = preg_split('/\s+/', $sentence);

Как бы я убрал слово после «йоги», учитывая, что слово после него не всегда коврики. И мне все еще нужны слова, чтобы быть там.

0

Решение

Этот фрагмент кода должен делать то, что вы ищете:

$words = explode(' ', $sentence);
foreach (array_keys($words, 'yoga') as $key) {
unset($words[$key+1]);
}
$sentence = implode(' ', $words);

Код довольно понятен: отделите предложение словами, определите все ключи, которые имеют значение «йога», сбросьте следующее слово и составьте предложение из оставшихся слов.

6

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

$sentence = "I like yoga mats a lot.";
$word = "yoga";

echo preg_replace('#(\b' . preg_quote($word) . '\b)\W*\b\w+\b#U', '$1', $sentence);

Но следующим «словом» может быть «а», «то» и так далее. Чтобы пропустить те слова, которые не являются «словами», необходимо создать список и добавить дополнительные манипуляции.

PS: хорошо, объяснение регулярного выражения

#  - start of regexp
(  - start of capture
\b - boundary of the word
preg_quote($word)  - escaped word to find
\b - boundary of the word
) - close capture group
\W* - any non-word characters
\b - boundary of the next word
\w+ - word characters
\b - boundary
# - end of regexp
U - un-greedy modifier

и то, что соответствовало, было заменено содержимым группы захвата $1

1

<?php

$user_input = "tea";
$sentence="I like tea mats a lot.";
$word_to_remove = $user_input . " ";
$offset = strlen( $word_to_remove );

$start_pos = stripos( $sentence , $word_to_remove );
$end_pos = stripos( $sentence , " ", $start_pos+$offset );
$str_to_replace = trim( substr( $sentence , $start_pos+$offset, ($end_pos-$offset)-$start_pos ) );

$new_sentence = str_replace( $str_to_replace, "", $sentence );
$new_sentence = preg_replace( "/\s+/", " ", $new_sentence);

echo $new_sentence;

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