字符串替换字符串中的潜在括号

时间:2014-02-11 18:47:51

标签: php regex string replace

假设我有一个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

3 个答案:

答案 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);

也适用于其他类型的分隔符[{()}]等...