10

これが私の文字列です:

address='St Marks Church',notes='The North East\'s premier...'

使用してさまざまな部分を取得するために使用している正規表現match_all

'/(address|notes)='(.+?)'/i'

結果は次のとおりです。

住所 => セント マークス教会
のメモ => 北東部\

メモの \' 文字を無視するにはどうすればよいですか?

4

3 に答える 3

5

文字列をヒアドキュメントまたは二重引用符で囲んでいるかどうかはわかりませんが、貪欲ではないアプローチ:

$str4 = 'address="St Marks Church",notes="The North East\'s premier..."';
preg_match_all('~(address|notes)="([^"]*)"~i',$str4,$matches);
print_r($matches);

出力

Array
(
    [0] => Array
        (
            [0] => address="St Marks Church"
            [1] => notes="The North East's premier..."
        )

    [1] => Array
        (
            [0] => address
            [1] => notes
        )

    [2] => Array
        (
            [0] => St Marks Church
            [1] => The North East's premier...
        )

)

preg_split を使用した別の方法:

//split the string at the comma
//assumes no commas in text
$parts = preg_split('!,!', $string);
foreach($parts as $key=>$value){
    //split the values at the = sign
    $parts[$key]=preg_split('!=!',$value);
    foreach($parts[$key] as $k2=>$v2){
        //trim the quotes out and remove the slashes
        $parts[$key][$k2]=stripslashes(trim($v2,"'"));
    }
}

出力は次のようになります。

Array
(
    [0] => Array
        (
            [0] => address
            [1] => St Marks Church
        )

    [1] => Array
        (
            [0] => notes
            [1] => The North East's premier...
        )

)

非常に遅い昔ながらの方法:

$len = strlen($string);
$key = "";
$value = "";
$store = array();
$pos = 0;
$mode = 'key';
while($pos < $len){
  switch($string[$pos]){
    case $string[$pos]==='=':
        $mode = 'value';
        break;
    case $string[$pos]===",":
        $store[$key]=trim($value,"'");
        $key=$value='';
        $mode = 'key';
        break;
    default:
        $$mode .= $string[$pos];
  }

  $pos++;
}
        $store[$key]=trim($value,"'");
于 2013-06-06T19:58:24.780 に答える
1

したがって、バックスラッシュが前にない終了引用符まで一致させる必要があります。

(address|notes)='(.*?)[^\\]'

これにより[^\\]、' 文字の直前の文字がバックスラッシュ以外の文字に強制されます。

于 2013-06-06T19:49:30.467 に答える