Замена нескольких слов в строке на preg_replace, похоже, не работает

#php #regex

#php #регулярное выражение

Вопрос:

Код:

 $testing="sniper this and sniper that";
$connectors=array('and', 'now', 'but', 'still', 'so', 'only', 'therefore', 'moreover', 'besides', 'consequently','nevertheless', 'for', 'however', 'hence', 'either', 'or', 'neither', 'nor', 'both', 'also','while', 'then', 'who', 'which', 'that', 'although', 'though', 'since', 'until', 'as', 'if','after', 'before', 'how', 'once', 'when', 'lest', 'why', 'unless', 'because', 'till', 'where', 'whether','the', 'a', 'an','about', 'above', 'across', 'after', 'against', 'along', 'among', 'around', 'at', 'before', 'behind','below', 'beneath', 'beside', 'between', 'beyond', 'but', 'by', 'despite', 'down', 'during', 'except','for', 'from', 'in', 'inside', 'into', 'like', 'near', 'of', 'off', 'on', 'onto', 'out', 'outside', 'over',
        'past', 'since', 'through', 'throughout', 'till', 'to', 'toward', 'under', 'underneath', 'until', 'up', 'upon','with', 'within', 'without','who', 'whom', 'whose', 'which', 'that', 'this', 'these', 'those', 'I', 'Me', 'You', 'He', 'him', 'she','her', 'it', 'we', 'us', 'they', 'them', 'Mine', 'Yours', 'His', 'Hers', 'Its', 'Ours', 'Theirs', 'whoever','whomever', 'whichever', 'myself', 'yourself', 'himself', 'herself', 'itself','ourselves', 'yourselves', 'themselves');

foreach($connectors as $word)
{
    $pattern="/".strtolower($word)."/";
    $data=preg_replace($pattern,"/ /", $testing);
}
echo $data."<br>";
echo $testing;
  

Вывод:

снайпер это и снайпер то

снайпер это и снайпер то

Ожидаемый результат:

снайпер это и снайпер то

снайпер снайпер

Что я делаю не так?

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

1. Если есть, то ожидаемый результат должен быть обратным. Сначала вы повторяете измененные данные, а затем исходные.

2. Почему вы ожидаете вывода «снайпер это и снайпер то, снайпер снайпер»? Ваш код (не — см. Ниже) заменяет каждое слово из массива $ connectors на «/ /», следовательно, вы правильно ожидали бы вывод «sniper / / / / снайпер / /». Однако проблема в том, что вы используете preg_replace для $ testing (который остается неизменным). Итак, вам пришлось бы поместить оператор $data = $testing; , и ваш заменяющий stmt будет $data=preg_replace($ pattern, «/ /», $ data); В любом случае, я предполагаю, что вы, возможно, захотите заменить «/ /» на «».

3. Спасибо @polkageist. Внес эти изменения. Имеет смысл. Однако вместо sniper sniper теперь я получаю sn за sn за. Проблема в том, что «I» является одним из соединителей, и он заменяется в word. Как мне сделать так, чтобы просто заменять отдельные экземпляры «I», а не «i» в словах?

4. Попробуйте изменить ваше регулярное выражение, чтобы оно содержало модификатор «границы слова» b вокруг вашего, word, т.е. $pattern=’/b(‘.strtolower($ word).’) /’;

Ответ №1:

Для начала вы перезаписываете $data на каждой итерации.

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

1. Кроме того, вам не нужна / ваша замена, если, конечно, вы не хотите заменить ее строковым значением / /

Ответ №2:

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

 $testing = "sniper this and sniper that";
$connectors = array( /* your data */ );

$output = implode(' ', array_diff(explode(' ', $testing), $connectors));
  

Способ без учета регистра:

 $output = implode(' ', array_udiff(explode(' ', $testing), $connectors, 'strcasecmp'));
  

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

1. Привет, hsz. Как мне сделать это без учета регистра?

Ответ №3:

Почему бы просто не использовать:

 $testing = ......;
$connectors = array( ...... );
$data = str_ireplace( $connectors, " ", $testing);
echo $data."<br />".$testing;