在PHP中使用点匹配模式

时间:2010-10-14 02:04:31

标签: php regex

我需要在其中找到并替换带有点的子串。将搜索严格保持在字边界(\ b)非常重要。这是一个重现的示例脚本(我需要匹配“test。”):

<?php
# 1.php
$string = 'test. lorem ipsum';
if(!preg_match('~\btest\.\b~i', $string)) echo 'no match 1' . PHP_EOL;
if(!preg_match('~\btest\b\.~i', $string)) echo 'no match 2' . PHP_EOL;

这是输出:

x:\>php 1.php
no match 1

x:\>php -v
PHP 5.2.8 (cli) (built: Dec  8 2008 19:31:23)
Copyright (c) 1997-2008 The PHP Group
顺便说一下,如果搜索模式中有方括号,我也没有得到任何匹配。我当然逃避了它们,但仍然没有效果。

1 个答案:

答案 0 :(得分:2)

正则表达不懂;他们真的不知道什么是“字”。对于他们来说,单词边界只是一个位置,前面是一个单词字符,后面跟一个单词,后面跟一个单词字符,后面没有一个:

(?<=\w)(?!\w)|(?=\w)(?<!\w)

因此,第一次测试中.之后的位置只会是一个单词边界,如果后跟另一个单词字符[A-Za-z0-9_];在一些正则表达式中,定义基于更宽的范围字符,包括重音英文字母和其他脚本的字母,但在PHP中它只是ASCII字母和数字)。

我怀疑你想要做的是确保.后跟空格,或者它位于字符串的末尾。您可以直接表达这一观点:

'~\btest\.(?=\s|$)~i'

...或者更简洁,作为否定的先行:

'~\btest\.(?!\S)~i'

...换句话说,如果有下一个字符,那么它不是非空白字符。