php preg_replace匹配字符串,但只替换它的一部分

时间:2016-03-10 09:34:52

标签: php regex string

我有这样的文字: Retailer-ul Amazon foloseste metode severe pentru a-si descuraja etc. angajatii din depozite sa nu mai fure din produse. Pe ecrane li se arata siluete de angajati care au furat produse, li se spune ce au furat si cat valorau produsele, aparand si mentiunea "arestat" sau "concediat", scrie Bloomberg. Unii spun ca... and so on并且我正在尝试替换fraze中缩写的所有字符串,因此例如etc.是缩写,因为它后面的单词angajatii以小写字母开头,而不是{ {1}}这是fraze的结尾,因为它后跟单词produse.以大写字母开头,我不想删除它。

我有这个代码Pe,它匹配每个缩写,后跟$subject = preg_replace('~\b[a-z]+\.\s[a-z]~', '', $subject);和空格(.),然后是小写字母\s(例如[a-z] 1}}变为descuraja etc. angajatii而不是descuraja ngajatii)。我不想替换下一个单词的小写字母。我莫名其妙地无法避免它被替换。我怎样才能保持相同的匹配模式,但只替换它后面的缩写和点以及空格?谢谢。

2 个答案:

答案 0 :(得分:4)

您需要将[a-z]打包成positive lookahead

\b[a-z]+\.\s(?=[a-z])

请参阅regex demo

前瞻构造只是检查它内部定义的某个模式是否出现在当前位置的右侧。因此,(?=[a-z])检查在与\s匹配的空格后是否有小写的ASCII字母。如果有小写,则返回匹配(并进行替换),如果找不到小写,则匹配失败,不进行替换。

答案 1 :(得分:1)

试试这个\b[a-z]+\.\s(?=[a-z])