hypweb.net
XOOPSマニア  最新情報のRSS(サイト全体)
[ 自宅サーバーWebRing |ID=54 前後5表示乱移動サイト一覧 ]

TOP » UsersWiki » nao-pon » blog » 2013-06-27

RSS of nao-pon/blog
2013 6月 27 (木)
 

正規表現処理エンジン PCRE の パータン分析スイッチの有効性について anchor.png

イメージマネージャーを使用するにすると更新できなくなります - xpWiki - フォーラム という問題の原因として PCRE の S 修飾子が原因かも、という話が出ました。

今まで、特に確信がない正規表現パターンでも、なんとなく効くかもといった理由で、適当に付与していた S 修飾子なのですが、 :hammer: きちんと効くかどうか検証した上で、使用すべきだと痛感しましたので、簡単に検証してみました。

Page Top

テストスクリプト anchor.png

xpWiki レンダラーの BB-Code に対応する正規表現をすべて確認。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
$str = <<<EOD
(BB-Code を含んだ適当な文章 4,500字程度)
EOD;
$regs = array();
 
$regs[] = '/(?:\r\n|\r|\n)?\[code](?:\r\n|\r|\n)?(.*)(?:\r\n|\r|\n)?\[\/code\](?:\r\n|\r|\n)?/sU';
$regs[] = '/(?:\r\n|\r|\n)?\[code](?:\r\n|\r|\n)?(.*)(?:\r\n|\r|\n)?\[\/code\](?:\r\n|\r|\n)?/sUS';
 
$regs[] = '/\[email](.+?)\[\/email]/i';
$regs[] = '/\[email](.+?)\[\/email]/iS';
 
$regs[] = '/\[url=([\'"]?)((?:ht|f)tp[s]?:\/\/[!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\\1\](.+)\[\/url\]/sU';
$regs[] = '/\[url=([\'"]?)((?:ht|f)tp[s]?:\/\/[!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\\1\](.+)\[\/url\]/sUS';
 
$regs[] = '/\[url=([\'"]?)([!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\\1\](.+)\[\/url\]/sU';
$regs[] = '/\[url=([\'"]?)([!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\\1\](.+)\[\/url\]/sUS';
 
$regs[] = '/\[siteurl=([\'"]?)\/?([!~*\'();?:\@&=+\$,%#_0-9a-zA-Z.-][!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\\1\](.+)\[\/siteurl\]/sU';
$regs[] = '/\[siteurl=([\'"]?)\/?([!~*\'();?:\@&=+\$,%#_0-9a-zA-Z.-][!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\\1\](.+)\[\/siteurl\]/sUS';
 
$regs[] = '/(\[quote[^\]]*])(?:\r\n|\r|\n)(?![<>*|,#: \t+-])/';
$regs[] = '/(\[quote[^\]]*])(?:\r\n|\r|\n)(?![<>*|,#: \t+-])/S';
 
$regs[] = '/(?:\r\n|\r|\n)*\[\/quote\]/';
$regs[] = '/(?:\r\n|\r|\n)*\[\/quote\]/S';
 
$regs[] = '/\[img\s+align=([\'"]?)(left|center|right)\1(?:\s+title=([\'"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\7)?]([!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/U';
$regs[] = '/\[img\s+align=([\'"]?)(left|center|right)\1(?:\s+title=([\'"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\7)?]([!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/US';
 
$regs[] = '/\[img(?:\s+title=([\'"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\5)?]([!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/U';
$regs[] = '/\[img(?:\s+title=([\'"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\5)?]([!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/US';
 
$regs[] = '/\[img\s+align=([\'"]?)(left|center|right)\1(?:\s+title=([\'"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\7)?]([!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/U';
$regs[] = '/\[img\s+align=([\'"]?)(left|center|right)\1(?:\s+title=([\'"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\7)?]([!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/US';
 
$regs[] = '/\[img(?:\s+title=([\'"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\5)?]([!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/U';
$regs[] = '/\[img(?:\s+title=([\'"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\5)?]([!~*\'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/US';
 
$regs[] = '/\[siteimg\s+align=([\'"]?)(left|center|right)\1(?:\s+title=([\'"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\7)?]\/?([!~*\'();?\@&=+\$,%#_0-9a-zA-Z.-][!~*\'();\/?\@&=+\$,%#_0-9a-zA-Z.-]+?)\[\/siteimg\]/U';
$regs[] = '/\[siteimg\s+align=([\'"]?)(left|center|right)\1(?:\s+title=([\'"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\7)?]\/?([!~*\'();?\@&=+\$,%#_0-9a-zA-Z.-][!~*\'();\/?\@&=+\$,%#_0-9a-zA-Z.-]+?)\[\/siteimg\]/US';
 
$regs[] = '/\[siteimg(?:\s+title=([\'"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\5)?]\/?([!~*\'();?\@&=+\$,%#_0-9a-zA-Z.-][!~*\'();\/?\@&=+\$,%#_0-9a-zA-Z.-]+?)\[\/siteimg\]/U';
$regs[] = '/\[siteimg(?:\s+title=([\'"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=([\'"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=([\'"]?)([\d]+?)\5)?]\/?([!~*\'();?\@&=+\$,%#_0-9a-zA-Z.-][!~*\'();\/?\@&=+\$,%#_0-9a-zA-Z.-]+?)\[\/siteimg\]/US';
 
$regs[] = '/\x01(?:\=([^\]]+))?\](?:\r\n|[\r\n])((?:(?>[^\x01\x02]+)|(?R))*)\x02(?:\r\n|[\r\n]|$)?/';
$regs[] = '/\x01(?:\=([^\]]+))?\](?:\r\n|[\r\n])((?:(?>[^\x01\x02]+)|(?R))*)\x02(?:\r\n|[\r\n]|$)?/S';
 
$_reg = 'test|hoge|fuga';
 
$regs[] = '/\[\/?(?:' . $_reg . ')(?:(?: |=)[^\]]+)?\]/';
$regs[] = '/\[\/?(?:' . $_reg . ')(?:(?: |=)[^\]]+)?\]/S';
 
$regs[] = '/\[(' . $_reg . ')(?:\b[^\]]+)?].+\[\/\\1\]/sU';
$regs[] = '/\[(' . $_reg . ')(?:\b[^\]]+)?].+\[\/\\1\]/sUS';
 
$n = 0;
foreach($regs as $reg) {
    $n++;
    set_time_limit(30);
    $start = microtime(true);
    for ($i=0; $i < 10000; $i++) {
        preg_match($reg, $str);
    }
    echo $reg;
    echo ' : '. (microtime(true) - $start) . '<br>';
    if ($n%2 === 0) echo str_repeat('-', 80).'<br>';
}

Page Top

実行結果 anchor.png

/(?:\r\n|\r|\n)?\[code](?:\r\n|\r|\n)?(.*)(?:\r\n|\r|\n)?\[\/code\](?:\r\n|\r|\n)?/sU : 5.1569399833679
/(?:\r\n|\r|\n)?\[code](?:\r\n|\r|\n)?(.*)(?:\r\n|\r|\n)?\[\/code\](?:\r\n|\r|\n)?/sUS : 0.37282490730286
--------------------------------------------------------------------------------
/\[email](.+?)\[\/email]/i : 0.24048900604248
/\[email](.+?)\[\/email]/iS : 0.24318504333496
--------------------------------------------------------------------------------
/\[url=(['"]?)((?:ht|f)tp[s]?:\/\/[!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\1\](.+)\[\/url\]/sU : 0.23091006278992
/\[url=(['"]?)((?:ht|f)tp[s]?:\/\/[!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\1\](.+)\[\/url\]/sUS : 0.23208713531494
--------------------------------------------------------------------------------
/\[url=(['"]?)([!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\1\](.+)\[\/url\]/sU : 0.23122596740723
/\[url=(['"]?)([!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\1\](.+)\[\/url\]/sUS : 0.23223900794983
--------------------------------------------------------------------------------
/\[siteurl=(['"]?)\/?([!~*'();?:\@&=+\$,%#_0-9a-zA-Z.-][!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\1\](.+)\[\/siteurl\]/sU : 0.31252813339233
/\[siteurl=(['"]?)\/?([!~*'();?:\@&=+\$,%#_0-9a-zA-Z.-][!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\1\](.+)\[\/siteurl\]/sUS : 0.33435487747192
--------------------------------------------------------------------------------
/(\[quote[^\]]*])(?:\r\n|\r|\n)(?![<>*|,#: \t+-])/ : 0.3490879535675
/(\[quote[^\]]*])(?:\r\n|\r|\n)(?![<>*|,#: \t+-])/S : 0.35570693016052
--------------------------------------------------------------------------------
/(?:\r\n|\r|\n)*\[\/quote\]/ : 3.4016590118408
/(?:\r\n|\r|\n)*\[\/quote\]/S : 0.36038398742676
--------------------------------------------------------------------------------
/\[img\s+align=(['"]?)(left|center|right)\1(?:\s+title=(['"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\7)?]([!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/U : 0.31287097930908
/\[img\s+align=(['"]?)(left|center|right)\1(?:\s+title=(['"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\7)?]([!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/US : 0.31461405754089
--------------------------------------------------------------------------------
/\[img(?:\s+title=(['"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\5)?]([!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/U : 0.33726000785828
/\[img(?:\s+title=(['"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\5)?]([!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/US : 0.42045998573303
--------------------------------------------------------------------------------
/\[img\s+align=(['"]?)(left|center|right)\1(?:\s+title=(['"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\7)?]([!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/U : 0.31326389312744
/\[img\s+align=(['"]?)(left|center|right)\1(?:\s+title=(['"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\7)?]([!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/US : 0.31384992599487
--------------------------------------------------------------------------------
/\[img(?:\s+title=(['"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\5)?]([!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/U : 0.33749294281006
/\[img(?:\s+title=(['"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\5)?]([!~*'();\/?:\@&=+\$,%#_0-9a-zA-Z.-]+)\[\/img\]/US : 0.35765695571899
--------------------------------------------------------------------------------
/\[siteimg\s+align=(['"]?)(left|center|right)\1(?:\s+title=(['"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\7)?]\/?([!~*'();?\@&=+\$,%#_0-9a-zA-Z.-][!~*'();\/?\@&=+\$,%#_0-9a-zA-Z.-]+?)\[\/siteimg\]/U : 0.31132006645203
/\[siteimg\s+align=(['"]?)(left|center|right)\1(?:\s+title=(['"])?((?(3)[^]]*|[^\]\s]*))(?(3)\3))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\5)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\7)?]\/?([!~*'();?\@&=+\$,%#_0-9a-zA-Z.-][!~*'();\/?\@&=+\$,%#_0-9a-zA-Z.-]+?)\[\/siteimg\]/US : 0.31220507621765
--------------------------------------------------------------------------------
/\[siteimg(?:\s+title=(['"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\5)?]\/?([!~*'();?\@&=+\$,%#_0-9a-zA-Z.-][!~*'();\/?\@&=+\$,%#_0-9a-zA-Z.-]+?)\[\/siteimg\]/U : 0.3105890750885
/\[siteimg(?:\s+title=(['"])?((?(1)[^]]*|[^\]\s]*))(?(1)\1))?(?:\s+w(?:idth)?=(['"]?)([\d]+?)\3)?(?:\s+h(?:eight)?=(['"]?)([\d]+?)\5)?]\/?([!~*'();?\@&=+\$,%#_0-9a-zA-Z.-][!~*'();\/?\@&=+\$,%#_0-9a-zA-Z.-]+?)\[\/siteimg\]/US : 0.31125688552856
--------------------------------------------------------------------------------
/\x01(?:\=([^\]]+))?\](?:\r\n|[\r\n])((?:(?>[^\x01\x02]+)|(?R))*)\x02(?:\r\n|[\r\n]|$)?/ : 0.261470079422
/\x01(?:\=([^\]]+))?\](?:\r\n|[\r\n])((?:(?>[^\x01\x02]+)|(?R))*)\x02(?:\r\n|[\r\n]|$)?/S : 0.261470079422
--------------------------------------------------------------------------------
/\[\/?(?:test|hoge|fuga)(?:(?: |=)[^\]]+)?\]/ : 0.42223906517029
/\[\/?(?:test|hoge|fuga)(?:(?: |=)[^\]]+)?\]/S : 0.42319798469543
--------------------------------------------------------------------------------
/\[(test|hoge|fuga)(?:\b[^\]]+)?].+\[\/\1\]/sU : 0.38073801994324
/\[(test|hoge|fuga)(?:\b[^\]]+)?].+\[\/\1\]/sUS : 0.38188505172729
--------------------------------------------------------------------------------

ほとんどのパターンでまるで効果がありませんでした。

やはり、PHP マニュアル (PHP: 正規表現パターンに使用可能な修飾子 - Manual) にある

S
あるパターンを複数回使用する場合は、マッチングにかかる時間を 高速化することを目的として、パターンの分析に幾分か時間をかけても 良いでしょう。この修飾子を設定すると、追加のパターン分析が 行われます。現在、パターン分析は、最初の文字が単一ではなく、 かつ固定でないパターンに対してのみ有用です。


最初の文字が単一ではなく、 かつ固定でないパターンに対してのみ有用

この通りですね。 :shy:



トップ   凍結 差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 653, today: 1, yesterday: 0
初版日時: 2013-06-27 (木) 16:19:54
最終更新: 2013-06-27 (木) 16:19:54 (JST) (3917d) by nao-pon
このページのTopへ
メインメニュー
ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録
最近の更新
オンライン状況
138 人のユーザが現在オンラインです。 (5 人のユーザが UsersWiki を参照しています。)

登録ユーザ: 0
ゲスト: 138

もっと...
サイト情報