假设我有一个var $text
:
Lorem ipsum dolor坐下来。 John Doe Ut tincidunt,elit ut sodales molestie。
和var $name
:
John Doe
我需要在$name
中找到$text
的所有匹配项并在其周围添加一个href。
我目前使用str_replace
做什么。
但如果名称中有括号怎么办?
让var $text
看起来像这样:
Lorem ipsum dolor坐下来。 John(Doe)Ut tincidunt,elit ut sodales molestie。
或
Lorem ipsum dolor坐下来。 (约翰)Doe Ut tincidunt,elit ut sodales molestie。
我怎样才能用括号找到$name
?
答案 0 :(得分:2)
按名字和姓氏拆分名称。
$split = explode(' ', $name);
$first = $split[0];
$last = $split[1];
preg_replace(
"/(\(?($first)\)? \(?($last)\))/"
, $replacement
, $text
);
更具活力的方法
// split name string into sub-names
$split = explode(' ', $name);
// initiate the search string
$search = '';
// loop thru each name
// solves the multiple last or middle name problem
foreach ($split as $name) {
// build the search regexp for each name
$search .= " \(?$name\)?";
}
// remove first space character
$search = substr($search, 1);
// preg_replace() returns the string after its replaced
// note: $replacement isn't defined, left it for you :)
// note: the replacement will be lost if you don't
// print/echo/return/assign this statement.
preg_replace(
"/($search)/"
, $replacement
, $text
);
答案 1 :(得分:1)
$text = "Lorem ipsum dolor sit amet. (John) Doe Ut tincidunt, elit ut sodales molestie.";
$name = "John Doe";
function createUrl($matches) {
$name = $matches[0];
$url = str_replace(['(', ')'], '', $matches[0]);
return "<a href='index.php?name={$url}'>{$name}</a>";
}
$pattern = str_replace(' ', '\)? \(?', $name);
echo preg_replace_callback("/(\(?$pattern\)?)/", 'createUrl', $text);
答案 2 :(得分:0)
另一个仅使用preg_split
的版本$split=preg_split('/\s+/', $name);
$frst=$split[0];
$mid=$split[1];
$lst=$split[2];
另一个可能性是使用ucwords
$split=ucwords($name);
$frst=$split[0];
$mid=$split[1];
$lst=$split[2];
然后
preg_replace('.?$frst.? .?$mid.? .?$lst.?',$replacement,$text);
也适用于其他类型的分隔符[{()}]等...