在找到空格之前,如何检查带有正则表达式的字符串?

时间:2011-05-15 14:18:54

标签: php regex

我有这个正则表达式与PHP上的preg_replace函数:

$str=preg_replace(
    '#\b((Hello ).+)#',
    '<a class="lforum" href="$1">$1</a>',
    $str);

它会检查所有以Hello开头的字符串,后面跟着任何类型的字符(至少有一个字符,重复)。

例如:

Hello Mark \\ is checked
HelloMark  \\ is not checked

现在的问题是检查了这个字符串:

Hello Mark Cordi

因为白色空间无论如何都是char。

我不想要这个。或者,更好的是,如果字符串为Hello Mark Cordi,则必须仅替换Hello Mark

我该怎么做?感谢

编辑换行问题

我的实际功能:

echo example(htmlentities($myString, ENT_QUOTES, "UTF-8"));

function example($str) {
    $str=preg_replace(
        '#((Hello )[^ \n]+)#',
        '<a class="lforum" href="$1">$1</a>',
        $str);

    return nl2br($str);     
}

如果$ myString是:

Hello Mario
Ciao

(注意换行,所以在Hello Mario结束时有一个\ n)输出是这样的:

<a class="lforum" href="Hello Mario<br />">Hello Mario<br /></a><br />Ciao

而不是:

<a class="lforum" href="Hello Mario">Hello Mario</a><br />Ciao

所以它在替换时添加$ n和$ 1,它不应该:(

3 个答案:

答案 0 :(得分:3)

仅使用\w而不是.替换单词字符:

$str=preg_replace(
    '#\b((Hello )\w+)#',
    '<a class="lforum" href="$1">$1</a>',
    $str);

单词字符是:

  • A-Za-z
  • 0-9
  • _

这可能是你真正想要的,而不仅仅是排除空格。

答案 1 :(得分:2)

使用[^ ](除空白外的所有内容)而不是.

[^abc]表示“除了a,b和c 之外的所有内容”。这里我们用一个whitspace。

编辑(2):

This正在运作:

  $str=preg_replace(
        '#(Hello [^\s\n<]+)#',
        '<a class="lforum" href="$1">$1</a>',
        $str);

对于这样的字符串是可以的:Mark<...Mark\n...Mark ...(将...替换为您想要的内容。)

[^\s\n<]表示“除空格(\s),换行符(\n)和<”之外的所有内容。

答案 2 :(得分:0)

根据您的问题,编辑部分和各种评论,我认为以下代码应该适合您:

$str = "Hello Mario
Ciao";
var_dump(example(htmlentities($str, ENT_QUOTES, "UTF-8")));
function example($str) {
    $s=preg_replace(
        '~(Hello\W+[^\W]+)~s',
        '<a class="lforum" href="$1">$1</a>',
        $str);
    return nl2br($s);
}

输出

string(52) "<a class="lforum" href="Hello Mario">Hello Mario</a>"

重要的是使用带有正则表达式的s修饰符来匹配换行符,并使用\W来匹配空格+换行符。