2010-11-20 17 views
-1

次の出力を達成するために1行でpreg_replace()する方法?regex php:「取り除く[リンク1]取り除く[リンク2] ...取り除く」問題があるときに「取り除く」NO [リンク]

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

を...

+0

この「get rid」では混乱しています。それはいつも「取り除かれていますか?それとも別のものにすることができますか?それは不明だ。 – BeemerGuy

+0

あなたは "[リンク]"がないときには失敗すると言いますが、それでも出力はありません...失敗は何ですか? – BeemerGuy

+0

'get rid'は、括弧で囲まれていないテキスト、たとえば「blah blah blah text blah text [link1] blah blah [linktextofanysort2] blah text blah」とすることができます。今はっきりしている? - 元の質問を修正しました。上記を参照してください:... – ajo

答えて

0

どうしてですか?

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; 
+0

それは動作します! "[幹] [乙]" – ajo

+0

はい、リンクを置き換えたいだけですが、この方法では不要なテキストも削除されます影響を受けます... –

+0

??私の最後のコメントとしての出力はちょうど私がそれを望む方法ですが、 "[。]"コンストラクトが含まれていないと、空の出力に苦労します。 – ajo