2017-03-28 34 views
0

このコードでは、「some」で始まり「string」で終わるパターンのすべてのヒットを保持する配列を返したいと思います。特殊文字を含む正規表現

$mystr = "this string contains some variables such as $this->lang->line('some_string') and $this->lang->line('some_other_string')"; 
preg_match_all ("/\bsome[\w%+\/-]+?string\b/", $mystr, $result); 

私は

$this->lang->line(' 

で始まり、

さらに
') 

で終わるすべてのヒットを持っているのが好きしかし、私は取り残さ開始と終了パターンを持っている必要があります。言い換えれば、結果の配列に 'some_string'と 'some_other_string'があります。特別な文字のために、 'some'と 'string'をまっすぐ前方に置き換えることはできません。

+0

何[strpos](http://php.net/manual/en/function.strpos.php)についてはどうですか?あなたがポジションを見つけたら、終わりのタグを探し、その間にすべてを取る。 – Peon

+0

次回はhttps://regex101.com/に行き、質問を投稿する前に自己解決しようとします。試してみるのが最善の方法です。これは非常に基本的な質問だったので、あなたはその間に検索する必要があることを正確に知っていました。 – mickmackusa

+0

私にとっては基本的ではありません。リンクをありがとう、私は練習します。 – user3104427

答えて

0

あなたのための特別な文字をエスケープ例:

$mystr = "this string contains some variables such as \$this->lang->line('some_string') and \$this->lang->line('some_other_string')"; 
#array of regEx special chars 
$regexSpecials = explode(' ',".^$ * + - ? () [ ] { } \\ |"); 

#test string 1 
#here we have the problem that we have $ and ', so if we use 
# single-quotes we have to handle the single-quote in the string right. 
# double-quotes we have to handle the dollar-sign in the string right. 
$some = "\$this->lang->line('"; 

#test string 2 
$string = "')"; 

#escape chr(92) means \ 
foreach($regexSpecials as $chr){ 
    $some = str_replace($chr,chr(92).ltrim($chr,chr(92)),$some); 
    $string = str_replace($chr,chr(92).ltrim($chr,chr(92)),$string); 
} 

#match 
preg_match_all ('/'.$some.'(.*?)'.$string.'/', $mystr, $result); 

#show 
print_r($result); 

ハードの部分は、PHPでかつregexstringでeverthing権利を脱出することです。あなたは二重引用符で使用する場合も、あなたが右の正規表現のためのすべての特殊文字をエスケープしている

  • PHPの右にあるドル記号をエスケープする必要が

  • はもっとここで読む:

    What special characters must be escaped in regular expressions?

    What does it mean to escape a string?

    0
    $mystr = "this string contains some variables such as $this->lang->line('some_string') and $this->lang->line('some_other_string')"; 
    
    preg_match_all("/\$this->lang->line\('(.*?)'\)/", $mystr, $result); 
    

    出力:ここ

    array(1 
        0 => array(2 
           0 => $this->lang->line('some_string') 
           1 => $this->lang->line('some_other_string') 
          ) 
        1 => array(2 
           0 => some_string 
           1 => some_other_string 
          ) 
    
    ) 
    
    関連する問題