我有这个正则表达式与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,它不应该:(
答案 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
来匹配空格+换行符。