регулярное выражение php: «избавиться [link1] избавиться [link2] ... избавиться» - проблема «избавиться», когда НЕТ [ссылка] - PullRequest
0 голосов
/ 20 ноября 2010

Как выполнить preg_replace () одной строкой для достижения следующих результатов?

$string1="get rid1 [link1] get rid2 [link2] ..."; // any number of links
echo "[<a href=link1>link1</a>][<a href=link2>link2</a>]";
$string2="get rid any text any text get rid"; // = no links: is a possibility
echo "";

Я попробовал следующее, которое работает, например, $ string1, но не для $ string2 выше:

$regex="/".
"[^\[\]]*". // the non-bracketed text before: -> eliminate
"\[(.*?)\]". // the bracketed text: [.]: -> convert into links 
"[^\[\]]*"; // get rid of non-bracketed text after: -> eliminate
"/";
echo preg_replace($regex,'<a href=jp.php?jp=\1>[\1]</a>',$string1);

Я думаю, что группы без захвата (?:...) могут работать, но я не могу понять ...

1 Ответ

0 голосов
/ 20 ноября 2010

Почему не просто если?

if ($output = preg_replace($regex,'<a href=jp.php?jp=\1>[\1]</a>',$string1))
echo $output;

Редактировать: Ваше регулярное выражение не будет работать, preg_replace заменит ВСЕ сопоставленный текст, поэтому вам нужно будет сделать текст до и после аргументов ссылки тоже ... В следующих строках:

preg_replace("(text we dont want to replace)(text we do want to replace)(more junk text)",$1." altered $2 = ".$2." ".$3, $string1)

.

$output = preg_replace($regex,'<a href=jp.php?jp=\1>[\1]</a>',$string1);
if ($output != $string1)
echo $output;
...