2016-08-04 8 views
0

私は正規表現でマークアップを一致させようと無視して試合:正規表現:2つのブラケット

1. thats an [External Link](www.external.com), as you can see 
2. thats an [Internal Link](wiki.com/Internal Link), as you can see 

を生じるはずである

1. thats an [www.external.com External Link], as you can see 
2. thats an [[Internal Link]], as you can see 

はそれの両方がこのpreg_replacesで正常に動作:

1. $line = preg_replace("/(\[)(.*?)()(.*)(\])/", "[$4]($2)", $line);    
2. $line = preg_replace("/(\[\[)(.*)(\]\])/", "[$2](wiki.com/$2)", $line); 

しかし、彼らはお互いに干渉しているので、他のものが醜い結果を返した後に置き換えます。だから私は試合の一つを無視しようとしています。私はこの1つで最初の正規表現を交換しようとした:

([^\[]{0,})(\[)([^\[]{1,})()(.*)(]) 

[ではないの後と前に一つだけ[と文字がある場合、それは確認する必要があります。しかし、そのはまだ[][Internal Link]に一致するが、それは次の2つのケースを処理するためのコールバック関数で条件付き交換を定義するパターンを構築することができpreg_replace_callbackと完全に

+1

'preg_replace_callback'を使用して1回のパスで実行します。あるいは、もっと簡単に、すでに作られたパーサを見つけてください。 –

+0

私はそれがコールバックとどのように動作するのか理解していませんか?パターンを無視して処理しないようにしたいからです。そして、はい、markup-> markdown libを探していますが、まだ見つかりませんでした。そして、実際に私が必要とするような多くの魔法ではない、私はすでに自分で最も多くをしました。 – Asara

答えて

1

をこの部分を無視すべきです。このようにして、文字列は1回だけ解析されます。

$str = <<<'EOD' 
1. thats an [www.external.com External Link], as you can see 
2. thats an [[Internal Link]], as you can see 
EOD; 

$domain = 'wiki.com'; 
$pattern = '~\[(?:\[([^]]+)]|([^] ]+) ([^]]+))]~';  

$str = preg_replace_callback($pattern, function ($m) use ($domain) { 
    return empty($m[1]) ? "[$m[3]]($m[2])" : "[$m[1]]($domain/$m[1])"; 
}, $str); 

echo $str; 

パターンが交互(?: xxx | yyy)を使用します。最初のブランチは、内部リンクと第2の外部リンクを記述します。

2番目のブランチが成功すると、最初のキャプチャグループ1は空ですが、定義されます。コールバック関数は、どのブランチが成功したかを知り、適切な置換文字列を返すようにテストする必要があります。

+0

thyxはcharmeのように動作します。キー[$ m [2]]($ m [3])= [$ m [3]]($ m [2])の交換が必要です。 – Asara

関連する問題