关于正则表达式:PHP删除特定单词后面的下两个单词

PHP remove next two words after a specific word

在PHP中,我如何删除特定单词preg_replace后面的两个单词?例如:字符串:lorem ipsum dolor sit amet,consetetur sadipscing eliter,sed diam.具体词:ipsum新弦:洛雷姆·伊普苏姆·阿美,康塞特·萨迪普辛格·艾丽特,塞德·戴姆。

这是我当前的代码:

1
2
3
4
$txt ="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam.
Specific word: ipsum"
;
$str= preg_replace('/\W\w+\s*(\W*)$/', '$1', $txt);
echo $str;

但它只是删除字符串的最后一个字。

谢谢你谨致问候


您可以使用(?<=ipsum)(?: \w+){2},但如果要包括标点符号,请使用(?<=ipsum)(?: [A-Za-z,.!]+){2}

1
2
3
function remove2w($anchor, $text, $number = 2) {
    return preg_replace(sprintf('/(?<=%s)(?: \w+){%s}/', $anchor, $number), '', $text);
}

输出:

1
2
remove2w('ipsum', 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam.')
>>> Lorem ipsum amet, consetetur sadipscing elitr, sed diam.


另一种使用explode()的方法。您可以按拆分字符串,然后按array_search()拆分$word的字符串,它将为您提供数组中的索引,然后简单地按unset()拆分接下来的2个元素:

1
2
3
4
5
6
7
8
<?php
$txt ="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam.";
$word ="ipsum";
$txtArr = explode("", $txt);
$i = array_search($word, $txtArr);
unset($txtArr[$i + 2]);
unset($txtArr[$i + 1]);
var_dump(implode("", $txtArr));

结果

Lorem ipsum amet, consetetur sadipscing elitr, sed diam

演示

注意:如果找不到$word,您需要做一些错误处理。


preg_replace()提供了相当大的灵活性:

1
2
3
4
5
<?php
$needle ="ipsum";
$haystack ="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam.";
$pattern = sprintf('|(%s)\s+\w+\s+\w+|', $needle);
var_dump(preg_replace($pattern, '$1', $haystack));

输出显然是:

1
string(57)"Lorem ipsum amet, consetetur sadipscing elitr, sed diam."


在这项任务中有许多考虑因素。

  • 您的目标子字符串是否需要单词边界?如果没有它们,您可能会执行无意的匹配;但是只有您可以为您的项目决定这一点。
  • 你需要不区分大小写的匹配吗?我猜:是的。
  • 如果目标子字符串是字符串中的最后一个或最后一个单词,会发生什么情况?是否允许省略一个或零个单词?我猜:是的。
  • 你需要考虑/包括标点符号,对吗?我猜:是的。
  • 目标子字符串可能包含regex敏感字符吗?如果是,建议使用preg_quote()。我猜:不,但是如果你不确定的话,你可以在注射前打电话给针上的preg_quote()
  • 这是一个完整的针电池:(演示)

    1
    2
    3
    4
    5
    6
    $txt = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam.';
    $needles = str_word_count(strtolower($txt),1);
    foreach($needles as $needle){
        echo"($needle) =>",preg_replace('~\b'.$needle.'\b\S*\K(?:\s\S+){0,2}~i','',$txt),"
    "
    ;  // use '(($0))'' as replacement to see the substring that is removed
    }

    输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (lorem) => Lorem sit amet, consetetur sadipscing elitr, sed diam.
    (ipsum) => Lorem ipsum amet, consetetur sadipscing elitr, sed diam.
    (dolor) => Lorem ipsum dolor consetetur sadipscing elitr, sed diam.
    (sit) => Lorem ipsum dolor sit sadipscing elitr, sed diam.
    (amet) => Lorem ipsum dolor sit amet, elitr, sed diam.
    (consetetur) => Lorem ipsum dolor sit amet, consetetur sed diam.
    (sadipscing) => Lorem ipsum dolor sit amet, consetetur sadipscing diam.
    (elitr) => Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
    (sed) => Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed
    (diam) => Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam.

    分解:

    1
    2
    3
    4
    5
    6
    7
    ~                #pattern delimiter
    \b'.$needle.'\b  #match needle as a whole word
    \S*              #match zero or more trailing character as long as first character is a non-word character.  This may be replaced with [[:punct:]]+ if more desirable/accurate
    \K               #restart fullstring match
    (?:\s\S+){0,2}   #match zero, one or two sequences of: a whitespace character followed by one or more non-whitespace characters
    ~                #pattern delimiter
    i                #case-insensitive pattern modifier