• ベストアンサー

正規表現について

/foo/hogehoge/bar.html ↓ ./bar.html と foo/hogehoge/bar.html ↓ ./bar.html このように置換したいのですが、うまくいきません。 /から最初の/まではうまくいくので、それを2回することでできるのですが、1回でできる方法が気になりました。 お手数ですがよろしくお願いします。 foo/hogehoge/bar.html の後に foo/hogehoge/bar.html があっても、最初のfoo/hogehoge/bar.html のみ置換したいです。

  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

質問を誤読してるかも知れませんが、こういうのでいいですか? $pattern = '/\/?foo\/hogehoge/'; $txt_org = '文字列 foo/hogehoge/bar.html の後に foo/hogehoge/bar.html があっても'; $txt_new = preg_replace($pattern, '.', $txt_org, 1); echo "{$txt_new}\n"; $txt_org = '文字列 /foo/hogehoge/bar.html の後に foo/hogehoge/bar.html があっても'; $txt_new = preg_replace($pattern, '.', $txt_org, 1); echo "{$txt_new}\n";

platina205
質問者

お礼

ありがとうございます。 期待通りの動きで間違いないのですが、もう少しパフォーマンスの良い記述を探しております。 ご教授お願い致します。

その他の回答 (1)

回答No.2

ごめんなさい、やはり間違ってましたか。 実はまだ意図を汲み取れていません。 fooとかhogehogeのところが任意文字列で $text = preg_replace('|[/\w]*/(\w*\.html)\b|', './$1', $text_org, 1); みたいなやつの高速バージョンをお探しだったとかでしょうか。 どうやら私の手に余るようです。 お急ぎの所、中途半端に手を出してごめんなさい。

関連するQ&A

  • 正規表現の使い方をお教えください

    サクラエディター使っていますが・・・。  正規表現の使い方の勉強中ですWEBも参考させていただいているのですが    今回の質問は・・・(4)です   (1)置換前 .*削除 削除が一番最後の所から削除を含む前を選択   (2)置換前 削除.* 削除が一番最初の所から削除を含む後を選択   (3)置換前 ^.*?削除 削除が一番最初の所から削除を含む前を選択   (4)     削除が一番最後の所から削除を含む後を選択 例・正規表現である削除が行の二か所以上あるとき最後に出てくる削除より後を削除したい・  この場合「削除」が二か所ありますが後に出てきた「削除」より後を削除したいのです  宜しくお願いします。

  • 正規表現で置換

    その1 $str = "ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげ"; ↓ $str = "ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="./foo/faa/fii/xxx.jpg" width="320" height="240" />ほげほげ"; その2 $str = "<img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげ"; ↓ $str = "<img src="./foo/xxxx.jpg" width="320" height="240" />ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="./foo/faa/fii/xxx.jpg" width="320" height="240" />ほげほげ"; このような文字列があった時に、次のように従って置換したいです。 1.imgのタグの内部に、「http://yyy.hoge.jp/hage/hige/xxx.jpg」という文字列があった場合、「./foo/faa/fii/xxx.jpg」という文字列に置き換える。 2.それ以外のURLの場合は置換しない。 3.その1とその2では「xxx.jpg」となっていますが、jpg以外の拡張子の場合も存在する。 4.日本語とURLの位置や個数はバラバラです。 5.URLの中のxxxとyyyは不定の文字列で、hage、hoge、hige、foo、faa、fiiは固定です。 6.使用している言語はPHPです。正規表現を1度だけでできれば理想的ですが、今回は2回に渡った処理でも問題ありません。 以上です。正しく処理できる正規表現、あるいは下記の正規表現の誤りを教えて頂ければ幸いです。 お手数ですが、よろしくお願い致します。 下記の方法では、うまくできませんでした。 $pattern = "/http:\/\/.*?hoge.jp\//"; $replacement = "./"; $str= preg_replace($pattern, $replacement, $str); $pattern2 = '/\/?hage\/hoge/'; $str = preg_replace($pattern2, '/foo/faa/fii', $str);

    • ベストアンサー
    • PHP
  • 正規表現?の置換方法について!(以降削除等)

    置換方法についてお詳しい方よろしくお願いいたします。 現在行いたいことは、ある対象とする記述以前、または以降の内容を削除したいと考えております。 具体的には、仮に<div id="hogehoge">とあったとします。 この場合、これ以前の記述を全て削除の置換を行いたいと思っています。 どんな記述があっても、<div id="hogehoge">の記述以前は全削除という置換です。 また、これは以前なのですが、この記述が終わったマーク、こちらも例えばですが<!--//hogehohe-->という記述終了を指定するコメントがあったとします。 その場合、<!--//hogehohe-->以降の記述は全て削除という指定を行いたいと思います。 伝わりますでしょうか。。。 何かを対象にする置換は調べたところ見つかったのですが、対象をもとに以前、以後という指定での置換が分かりません。>< お詳しい方いらっしゃいましたらアドバイスを頂けないでしょうか。 宜しくお願いいたします。

  • 正規表現の否定先読みについて

    <a href="http://example.com/aaaa/hogehoge1.jpg" target="_blank"><img src="http://example.com/aaaa/hogehoge1.jpg" width="100" alt="huge1"></a><br />hogehoge<br /><a href="http://example.com/bbbb/hogehoge2.jpg" target="_blank"> <img src="http://example.com/bbbb/hogehoge2.jpg" alt="huge2"></a> こういうHTMLがあるとします。改行はなく1行です。 このHTMLから正規表現で 『width="100"がついていない<img>タグ』 のsrc=""までを抜き出して置換したいのです。 期待する結果は <img src="http://example.com/hage/hogehoge2.jpg" です。 そこで /<img src="http:\/\/.*?.jpg"\s(?!width)/ というパターンを試しましたが、.*?の最短一致が思った通りにいかず <img src="http://example.com/aaaa/hogehoge1.jpg" width="100" alt="huge1"></a><br />hogehoge<br /><a href="http://example.com/bbbb/hogehoge2.jpg" と、1つ目の<img>が入ってしまい、2つ目の<a>タグまで抜き出されてしまいます。 これをうまくwidth="\d+"と入っていない<img>タグのみに適用させる方法はないでしょうか? どなたかよろしくおねがいいたします。

    • ベストアンサー
    • PHP
  • 値を取得できない

    var hoge = {   piyo: {     bar = /* ここにhogehoge.fooの値を入れたい */   },   foo: "Hello, World!" } でhoge.piyo.barからhoge.fooの値を取得したいのですが、 hoge.fooとやってもthis.fooとやっても取得できません。 どうすれば取得できるのでしょうか?

  • 正規表現による置換

    HTMLの構文も正規表現もよく理解しないままに作業をしているので とんちんかんなことを言っているのかもしれません 合わせて指摘してもらえると助かります Yahoo pipes 使ってる中で発生している現象です 目的としては HTMLタグから一部の文字列を取り出したく 変換元のXTMLは以下のようなものです(一部加工しています(***** の部分は隠しています) <a rel="nofollow" target="_blank" href="http://*****.html">抽出したい文字列</a> <img alt="new" class="new" height="15" src="http://*****.jpg" width="32"/> に対して 置換対象  .*html">(.*)  置換後  $1   を行ってからさらに 置換対象  (.*)<img.*    置換後  $1  としたところ 一応抽出はできました    本来 2回目は  (.*)</a  の気がするのですが1回目の結果を見るとなぜか</a>    の部分もなくなってしまっています  これも不思議なのですが 2回に分けて行うのは面倒なので1度で行いたいと思い 置換対象  .*html">(.*)<img.* 置換後  $1 としてみたのですが 求めている文字列の抽出をすることができませんでした     .一応 *html">(.*)</a.*  というのもやってみましたが結果は変わりませんでした これは当然の結果ななのか変換(処理)ツールの不具合なのかの判断ができません 分かる人がいたら教えてもらえないでしょうか 情報足りなければ補足させていただきます

  • 正規表現でファイル名の抽出

    社内の掲示板に属するWebアプリケーションを制作しております。 複数のファイルをアップロードするために、<input type="file" ...> で得たファイルのパスを一時的にリストに表示させる仕様になりました。 そこで、javascriptの正規表現オブジェクトで次のようなフルパスから ファイル名のみを抽出することを考えました。  a: c:\hoge.txt  b: \\foo_server\foo_dir\hoge2.txt a,bから、それぞれ hoge.txt hoge2.txt を得るために、/[^\\].*/によって \\を取り除いた後で/\\.*\..*$/ によって欲しい文字列が得られると考えましたら文字列どころか何も 得られませんでした。 /[^\\].*/までは動いているようです。 オブジェクトの使い方が誤っていると考えているのですが、どの様に 扱えばよいのか皆目見当がつかなくなりました。 大変お手数ですが、ご教示願います。

  • 正規表現

    次の文字列の<div>タグで囲まれた部分を取得したいです。 <div>タグは一番最初のもの ------------------------------------------------------------------ <div>ここは何文字かわからない</div> このうしろにも</div>が何回かきます。 ------------------------------------------------------------------ ですので、最初に一致した</div>で終わりにしたいです。 処理時間もその後のテキストを見なくてもよくなるでしょうし。 @"<div>{.}\A(</div>))" こうした所マッチしすぎてエラーになってしまいました。 よろしくお願いしまうs。

  • スラッシュの正規表現(置換)

    php初心者で更に正規表現(置換)が特に苦手なので、教えてください。 例えば下記のurlで http://www.goo.ne.jp/ を一番後ろの"/(スラッシュ)"だけとって、 http://www.goo.ne.jp にするにはどうしたら宜しいでしょうか? ちなみに、 http://www.goo.ne.jp/test のような場合は、何もしない事も出来るのでしょうか? いまいち方法が分からず、こんな感じで行ったのですが、 $url = preg_replace("\///", "\\1",$url); エラーが出てしまいます。

    • ベストアンサー
    • PHP
  • 正規表現

    正規表現で、テスト1回目以外を上手に消す方法を有りませんか。 いつも<span style="font-size:14px;">と</span>を個別にリプレースして消してますが 一度にできそうな気がしています。 <span style="font-size:14px;">テスト1回目</span> よろしくお願いします。

    • ベストアンサー
    • HTML

専門家に質問してみよう