2014-02-11 4 views
0

Пусть говорит, у меня есть вар $text:
замена строки с потенциальными скобками в строке

Lorem Ipsum боль сидеть Амет. John Doe Ut tincidunt, elit ut sodales molestie.

и от самого Var $name:

John Doe

мне нужно выяснил все вхождения $name в $text и добавьте HREF вокруг него.
Что я сейчас делаю с str_replace.

Но что, если в названии есть круглые скобки?
Пусть говорят вар $text выглядеть вместо этого:

Lorem Ipsum боль сидеть Амет. John (Doe) Ut tincidunt, elit ut sodales molestie.

или

Lorem Ipsum боль сидеть Амет. (John) Doe Ut tincidunt, elit ut sodales molestie.

Как я могу найти $name с круглыми скобками?

+0

в круглые скобки единственно возможный вариант? –

+0

Вы можете использовать регулярное выражение, но сначала вам нужно будет определить точные требования, какие скобки и т. Д. – jeroen

+0

@ Скобки в диалоге - единственное возможное изменение. –

ответ

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

разделите имя по фамилии и фамилии.

$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 
); 
+2

Я думаю, вы имеете в виду 'preg_replace' –

+0

К сожалению, я не могу разбить имя, потому что кого-то можно назвать примером:« Ryan Nugent Hopkins » –

+1

ну, тогда вы можете поместить строку поиска в цикл foreach, чтобы сделать ее более динамичной. –

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

работает также с другим типом разделителей [{()}] и т.д ...

Смежные вопросы