6221


■対象

[code]

    $hoge="××××
    
    tab→    抽出抽出    ←tab
    
    ××××××";
    
[/code]

* * *

■やりたいこと1  
・PHP正規表現で、「タブ区切り」から「タブ区切り」までを選択して、前後にdivタグを挿入したい

・うまくいかないコード

[code]

    preg_replace(/\t(.*?)\t)/m, "<div>$1</div>", $hoge);
    
[/code]

・希望結果1

[code]

    $hoge="××××
    
    tab→<div>抽出抽出</div>←tab
    
    ××××××";
    
[/code]

* * *

■やりたいこと2  
・PHP正規表現で、「空行」から「空行」までを選択して、前後にdivタグを挿入したい

・うまくいかないコード

[code]

    preg_replace(/^\n(.*?)^\n)/m, "<div>$1</div>", $hoge);
    
[/code]

・希望結果2

[code]

    $hoge="××××
    <div>
    tab→    抽出抽出    ←tab
    </div>
    ××××××";
    
[/code]


CC BY-SA 3.0
2015-02-10T02:29:26.793
6210
2015-02-13T01:04:50.103
2015-02-13T01:04:50.103
7886
question
php 正規表現
PHP正規表現で、「タブ区切り」から「タブ区切り」までを選択して、前後にdivタグを挿入


■ 1つ目

[code]

    $hoge="××××
    
    tab→    抽出抽出    ←tab
    
    ××××××";
    
    echo "\nbefore:\n", $hoge;
    $replace = preg_replace('/\t([^\t]+)\t/', '<div>$1</div>', $hoge);
    echo "\nafter:\n", $replace;
    
[/code]

で、こんなのが得られるのでは所望の動きではないでしょうか？

[code]

    before:
    ××××
    
    tab→   抽出抽出        ←tab
    
    ××××××
    after:
    ××××
    
    tab→<div>抽出抽出</div>←tab
    
    ××××××
    
[/code]

■ 2つ目  
(2015-02-12 11:41 編集)  
手直ししてみました。こういう事がやりたいんですかね？  
ちょっと自分の実力では1つの正規表現では表しきれなかったです。(´・ω・`)

[code]

    <?php
    $hoge="××××
    
    tab→    抽出 抽出
    抽出    ←tab
    
    ××××××";
    
    echo "\nbefore:\n", $hoge;
    $replace = preg_replace('/(?<=\n\n)(.*)(\n)(.*)(?=\n\n)/s', '$1 $3', $hoge);
    $replace = preg_replace('/\n\n(.+)\n\n/s', '<div>$1</div>', $replace);
    echo "\nafter:\n", $replace;
    ?>
    
[/code]

で、こんなのが得られるのでは所望の動きではないでしょうか？

[code]

    before:
    ××××
    
    tab→   抽出 抽出
    抽出    ←tab
    
    ××××××
    after:
    ××××<div>tab→      抽出 抽出 抽出  ←tab</div>××××××
    
[/code]


CC BY-SA 3.0
2015-02-10T03:43:30.660
6221
2015-02-12T09:37:03.450
2015-02-12T09:37:03.450
2383
2383
6210
answer


これ、どうしても一つの文でreplaceしないといけないのですか？  
preg_matchでtabで区切り、採れたものにdivと/divを前後につけてつなぎ直すほうがシンプルでいいと思いますが。


CC BY-SA 3.0
2015-02-10T23:59:11.023
6283
2015-02-10T23:59:11.023
8136
6210
answer

[code]

    $hoge = preg_replace('/\r\n|\r/', "\n", $hoge);
    $replace = preg_replace('/(?:\n\n)(.+?)(?=\n\n)/s', '<div>$1</div>', $hoge);
    
[/code]

改行がプラットフォームによってまちまちなので\nに統一してから、空行で挟まれた部分を抽出しています。最後の「?=」は肯定先読みで、「空行 抽出部分1 空行
抽出部分2 空行・・・」みたいな感じでもうまく抽出できるようにしています。

どうも冗長な感じがするのでもう少し短くできるような気もしますが…


CC BY-SA 3.0
2015-02-12T00:16:57.543
6344
2015-02-12T00:16:57.543
2232
6210
answer