2017-01-18 3 views
1

このコードは正常に実行されています。 $ array [1]は列名を返しました。PHP複数の異なる正規表現

//My String 
$string = '<input value="{#Quantity#}" type="number" />'; 
preg_match_all('/{#(.*)#\}/i', $text, $array); 
print_r($array); 
/* 
Returned : 
Array 
(
    [0] => Array 
     (
      [0] => {#Quantity#} 
     ) 

    [1] => Array 
     (
      [0] => Quantity 
     ) 

) 
*/ 

ただし、テキストに列名がさらにある場合。それが動作していません。

$string = '<input value="{#Quantity#}" data-id="{#Id#}" type="number" />'; 
preg_match_all('/{#(.*)#\}/i', $text, $array); 
print_r($array); 
/* 
Returned : 
Array 
(
    [0] => Array 
     (
      [0] => {#Quantity#}" data-id="{#Id#} 
     ) 

    [1] => Array 
     (
      [0] => Quantity#}" data-id="{#Id 
     ) 

) 
*/ 

は、私がどのように正規表現があるべきこの配列

Array 
(
    [0] => Array 
     (
      [0] => {#Quantity#}" data-id="{#Id#} 
     ) 

    [1] => Array 
     (
      [0] => Quantity 
      [1] => Id 
     ) 

) 

にしたいですか? だから、どうすればこの問題を解決できますか?

答えて

2

$string変数にテキストを割り当ててからpreg_match_all$textを使用しています。 私はそれがちょうどタイプミスであると思いますか?

ここで問題の他の部分について説明します。あなたは貪欲でないマッチを使用するべきです。 .*の後に?を追加すると、試合は貪欲でなくなります。最短の試合で止まります。

preg_match_all('/{#(.*?)#\}/', $string, $array); を使用すると、$ arrayはこれになります。それはあなたの後のことですか?

Array 
(
    [0] => Array 
    (
     [0] => {#Quantity#} 
     [1] => {#Id#} 
    ) 

[1] => Array 
    (
     [0] => Quantity 
     [1] => Id 
    ) 

) 
+0

これは良い答えですが、この式では「i」スイッチが冗長ではありませんか? –

+1

https://translate.google.com/#tr/en/eyvallah%20karde%C5%9Fim :) –

+0

この単純なケースでは、無視できるほどの差はありません。しかし、遅延マッチングを使用するとパフォーマンスが低下します。参照してください理由の説明については、http://www.regular-expressions.info/repeat.html#lazyを参照してください。 – Luke

1

正規表現を使用してください:'/{#([^}]*)#\}/'

代わりに繰り返し.(任意の文字)に一致するのは、あなたが、一致を停止したい場所}があるとして「}以外の任意の文字」である[^}]を探す必要があります。

Match 1 
Full match 14-26 `{#Quantity#}` 
Group 1. 16-24 `Quantity` 

Match 2 
Full match 37-43 `{#Id#}` 
Group 1. 39-41 `Id`