php 两个单词 正则表达式字符前_关于正则表达式:PHP删除特定单词后面的下两个单词...

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

这是我当前的代码:

$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}。

function remove2w($anchor, $text, $number = 2) {

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

}

输出:

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个元素:

$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()提供了相当大的灵活性:

$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));

输出显然是:

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

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

您的目标子字符串是否需要单词边界?如果没有它们,您可能会执行无意的匹配;但是只有您可以为您的项目决定这一点。

你需要不区分大小写的匹配吗?我猜:是的。

如果目标子字符串是字符串中的最后一个或最后一个单词,会发生什么情况?是否允许省略一个或零个单词?我猜:是的。

你需要考虑/包括标点符号,对吗?我猜:是的。

目标子字符串可能包含regex敏感字符吗?如果是,建议使用preg_quote()。我猜:不,但是如果你不确定的话,你可以在注射前打电话给针上的preg_quote()。

这是一个完整的针电池:(演示)

$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

}

输出:

(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.

分解:

~                #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 delimiteri                #case-insensitive pattern modifier

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值