• ベストアンサー

部分文字列の置換

お世話になります。 <A href="index.php?page=aaa/bbbbb/cccc.xls"> という文字列からindex.php?page=を削除して、 <A href="aaa/bbbbb/cccc.xls"> としたいのですが、よくわかりません。 ereg_replace() preg_replace() など、調べて挑戦しているのですが、できません。 おわかりになる方、教えていただけないでしょうか。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.7

#6のパターンは echo preg_replace('/index.php\?page=(?!.*\.html)/', '', $str); のように書き換えられますね。 後方参照はしない方が多分よいので、これを反映するとこうですか。 <?php $ary = array( '<A href="index.php?page=aaa/bbbbb/cccc.xls">', '<A href="index.php?page=aaa/bbbbb/cccc.html">', '<A href="index.php?page=aaa/bbbbb/cccc.htm">', '<A href="index.php?page=aaa/bbbbb/cccc.mp3">', '<A href="index.php?page=aaa/bbbbb/cccc.txt">' ); foreach ($ary as $str) { echo "$str -> "; echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str); echo "\n"; } echo "#####################\n"; foreach ($ary as $str) { echo "$str -> "; //echo preg_replace('/index.php\?page=((?!.*\.html).*)/', '$1', $str); echo preg_replace('/index.php\?page=(?!.*\.html)/', '', $str); echo "\n"; } <A href="index.php?page=aaa/bbbbb/cccc.xls"> -> <A href="aaa/bbbbb/cccc.xls"> <A href="index.php?page=aaa/bbbbb/cccc.html"> -> <A href="index.php?page=aaa/bbbbb/cccc.html"> <A href="index.php?page=aaa/bbbbb/cccc.htm"> -> <A href="index.php?page=aaa/bbbbb/cccc.htm"> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> -> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> <A href="index.php?page=aaa/bbbbb/cccc.txt"> -> <A href="index.php?page=aaa/bbbbb/cccc.txt"> ##################### <A href="index.php?page=aaa/bbbbb/cccc.xls"> -> <A href="aaa/bbbbb/cccc.xls"> <A href="index.php?page=aaa/bbbbb/cccc.html"> -> <A href="index.php?page=aaa/bbbbb/cccc.html"> <A href="index.php?page=aaa/bbbbb/cccc.htm"> -> <A href="aaa/bbbbb/cccc.htm"> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> -> <A href="aaa/bbbbb/cccc.mp3"> <A href="index.php?page=aaa/bbbbb/cccc.txt"> -> <A href="aaa/bbbbb/cccc.txt">

rqg2010
質問者

お礼

sakusaker7さん、お早うございます。 大変ご丁寧に各種のパターンについてまで、チェックをしていただきありがとうございます。 ばっちりです。 どうもありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.6

.htmlを除外するパターン。 <?php $ary = array( '<A href="index.php?page=aaa/bbbbb/cccc.xls">', '<A href="index.php?page=aaa/bbbbb/cccc.html">', '<A href="index.php?page=aaa/bbbbb/cccc.htm">', '<A href="index.php?page=aaa/bbbbb/cccc.mp3">', '<A href="index.php?page=aaa/bbbbb/cccc.txt">' ); foreach ($ary as $str) { echo "$str -> "; echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str); echo "\n"; } echo "#####################\n"; foreach ($ary as $str) { echo "$str -> "; echo preg_replace('/(index.php\?page=)((?!.*\.html).*)/', '$2', $str); echo "\n"; } <A href="index.php?page=aaa/bbbbb/cccc.xls"> -> <A href="aaa/bbbbb/cccc.xls"> <A href="index.php?page=aaa/bbbbb/cccc.html"> -> <A href="index.php?page=aaa/bbbbb/cccc.html"> <A href="index.php?page=aaa/bbbbb/cccc.htm"> -> <A href="index.php?page=aaa/bbbbb/cccc.htm"> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> -> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> <A href="index.php?page=aaa/bbbbb/cccc.txt"> -> <A href="index.php?page=aaa/bbbbb/cccc.txt"> ##################### <A href="index.php?page=aaa/bbbbb/cccc.xls"> -> <A href="aaa/bbbbb/cccc.xls"> <A href="index.php?page=aaa/bbbbb/cccc.html"> -> <A href="index.php?page=aaa/bbbbb/cccc.html"> <A href="index.php?page=aaa/bbbbb/cccc.htm"> -> <A href="aaa/bbbbb/cccc.htm"> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> -> <A href="aaa/bbbbb/cccc.mp3"> <A href="index.php?page=aaa/bbbbb/cccc.txt"> -> <A href="aaa/bbbbb/cccc.txt"> 細かいこというと、aaa/hoge.htmlfiles/moge.txt みたいのも拾っちゃいますが それはそれということで。

全文を見る
すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

とりあえず指摘だけ。 >echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str1); >最初の正規表現は、xlsだったら変換するもの、次のはhtmlでなければ変換するものです。 違います。 [^(html)] にマッチするのは、'h', 't', 'm', 'l', '(', ')' ではない 一文字ですから、拡張子がhtmlのものを除外するというのには使えません。

全文を見る
すると、全ての回答が全文表示されます。
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.4

<?php $str0 = '<A href="index.php?page=aaa/bbbbb/cccc.xls">'; $str1 = '<A href="index.php?page=aaa/bbbbb/cccc.html">'; echo preg_replace('/(index.php\?page=)(.*\.xls)/', '$2', $str0); echo "\n"; echo preg_replace('/(index.php\?page=)(.*\.xls)/', '$2', $str1); echo "\n"; echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str0); echo "\n"; echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str1); echo "\n"; ?> これで、できます。後方参照を使用しています。 最初の正規表現は、xlsだったら変換するもの、次のはhtmlでなければ変換するものです。

rqg2010
質問者

お礼

masa6272さん、お早うございます。 レスありがとうございます。 できました。ばっちりです。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

<A href="aaa/bbbbb/cccc.xls"> になればいいんですよね? <?php $html = '<A href="index.php?page=aaa/bbbbb/cccc.xls">'; $html = ereg_replace('index.php\?page=','', $html); print_r($html); これで <A href="aaa/bbbbb/cccc.xls"> こうなりますけど? 補足にあるパターンだと、* の直前にあるのは ')' なので カッコ対の中身が繰り返し現れるということになるのでマッチしないということになってます。

rqg2010
質問者

補足

sakusaker7さん、お早うございます。 すぐに、また、お返事を頂きありがとうございます。 Suziさんの方へも同様に補足させていただきましたが、 私の説明不足でして、 <A href="index.php?page=aaa/bbbbb/cccc.xls"> については、「index.php?page=」を削除して、 <A href="index.php?page=aaa/bbbbb/cccc.html"> については、処理をしない。 と、いうことなものですので。 教えていただいた方法ですと、拡張子が、何であっても削除されてしまいました。 どうも、説明不足で申し訳ありませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • Suzi
  • ベストアンサー率38% (130/334)
回答No.2

index.php?page= だけを削除する正規表現なら、index.php.+?= ではどうでしょうか。 $html = ereg_replace('index.php.+?=, '', $html); か $html = ereg_replace('/index.php.+?=/', '', $html); とか。

rqg2010
質問者

補足

Suziさん、お早うございます。 早速お返事ありがとうございます。 私の説明不足でして、 <A href="index.php?page=aaa/bbbbb/cccc.xls"> については、「index.php?page=」を削除して、 <A href="index.php?page=aaa/bbbbb/cccc.html"> については、処理をしない。 と、いうことなものですので。 教えていただいた方法ですと、拡張子が、何であっても削除されてしまいました。 どうも、説明不足で申し訳ありませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>index.php?page= '?' がメタ文字なのを失念していてエスケープし忘れたとか? それ以外に思いつかないのですが、どんなパターンでトライしてだめだったか 補足していただけますか?

rqg2010
質問者

補足

sakusaker7さん、お早うございます。 こんなに早いレスありがとうございます。 $html = <A href="index.php?page=aaa/bbbbb/cccc.xls"> $html = ereg_replace('(index.php\?page=)*xls','*xls',$html); などと、やってみたのですが。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 任意の文字列で囲まれていない任意の文字列を置換するには

    任意の文字列で囲まれていない任意の文字列を置換したいです。 たとえば、『 [[ 』と『 ]] 』で囲まれていない『http://hogehoge/』を『<a href="http://hogehoge/">http://hogehoge/</a>』に置き換えるにはどうすればいいのでしょうか。 具体的には下記の【置換前】のテキストを【置換後】のような感じにしたいです。 【置換前】 http://hogehoge/ [[http://hogehoge/]] http://hogehoge/ http://hogehoge/ [[http://hogehoge/]] 【置換後】 <a href="http://hogehoge/">http://hogehoge/</a> [[http://hogehoge/]] <a href="http://hogehoge/">http://hogehoge/</a> <a href="http://hogehoge/">http://hogehoge/</a> [[http://hogehoge/]] preg_replaceかereg_replaceのどちらかで例を挙げてもらえるとありがたいです。ご教示お願いします。

    • ベストアンサー
    • PHP
  • ヒットする初回のみ置換する方法

    あいうえおかきくけこあいうえおあいうえお という文字列があった時、 初回の「あいうえお」のみ空に置換して かきくけこあいうえおあいうえお としたいのですが、str_replace()だと全部置換されてしまいますし、 preg_replace()やmb_ereg_replace()ではうまく置換されません。 対象とする文字列は、実際はHTMLタグやマルチバイトが混じっています。 置換するべき文字列は、全く同様のものが対象文字列内にも必ず含まれています。 preg_replace()やmb_ereg_replace()でも可能なのかもしれませんが、 どうやればいいのか分かりませんでした。 どなたかご教示下さい。

    • ベストアンサー
    • PHP
  • ある文字列から特定のタグとその中身を削除する方法について教えてください

    ある文字列から特定のタグとその中身を削除する方法について教えてください。 PHP4.3.9を使って作業する予定でスキルアップをしています。 表題の件について、教えていただければと存じます。 例えば、下記の文字列があるとします。  "あ<b>いいいい</b>う<b>ええええええええ</b>お" この<b>タグに囲まれた文字だけを削除して、"あうお"という文字を取得したいのです。 preg_replace関数、mb_ereg_replace関数を使えば出来そうな予感はするのですが 恥ずかしながら正規表現の書き方が分からず、やりたいことが実現できておりません。 これらの関数に限らず、簡単に実現できる方法があればご教授いただけないでしょうか。 以上、宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 【PHP】正規表現でHTMLを置換したいのですが・・・

    HTMLのソースを、正規表現で置換をしてから画面に出力したいのですが、どのような正規表現を記述すればいいのか分からず困っています。。。。 下記(befor)の4つのリンクのうち、ファイルの拡張子が、pdf、doc、xlsのファイルだけ「download.php」というPHPのプログラムを通してからダウンロードさせるために、文字列を(after)の様に置換をしたいのですが、なかなかうまくいきません。。。 どなたか、ご指導のほど宜しくお願いいたします。 (befor) $html = '<a href="/files/aaaa.pdf">あ</a><br>' . '<a href="/files/cccc.html">い</a><br>' . '<a href="/files/dddd.doc">う</a><br>' . '<a href="/files/eeee.xls">え</a><br>' ; (after) $html = '<a href=download.php?url=/files/aaaa.pdf>あ</a><br>' . '<a href="/files/cccc.html">い</a><br>' . '<a href=download.php?url=/files/dddd.doc>う</a><br>' . '<a href=download.php?url=/files/eeee.xls>え</a><br>' ;

    • ベストアンサー
    • PHP
  • 文字列を抜き出して置換

    《../img.jpg》 と言う文字列を <a href="../img.jpg"><img src="../img.jpg"></a> と言う具合に置き換えて書き出したいのですが、 $text="テスト文章《img.jpg》<br>テスト文章《test.gif》"; $test01=(strpos($text, "《")+2); $test02=(strpos($text, "》")-$test01); $test03=substr($text,$test01,$test02); $test04="<a href=\"".$test03."\"><img src=\"".$test03."\"></a>"; $test_txt=str_replace($test03,$test04,$text); これだと、 「テスト文章<a href="img.jpg"><img src="img.jpg"></a><br>テスト文章《test.gif》」 となってしまい、《../img.jpg》が複数個ある場合の処理がうまく出来ず困っています。 ループ処理すればいいのでしょうけど、どのような方法が適切なのか分かりません。 また、これ以外の方法「preg_match()」などで、いい方法がありましたら、ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • 文字列の置換の仕方について

    下記のような文字列の置換は、どのようにすればいいでしょうか? <?php $strString="abcd<!--s_1-->うほほ<!--e_1-->efg";//本当は、もっと長い文字列が入っています $strReplace="/<!--s_1-->.*<!--e_1-->/"; $word="あいう"; //関数へ飛ばします $result=fun_replace($strReplace,$strString,$word); function fun_replace($strReplace,$strString,$word){ //さて、どう組むか? } ?> 結果として、"abcd<!--s_1-->うほほ<!--e_1-->efg" → "abcd<!--s_1-->あいう<!--e_1-->efg" になればいいわけです。 ただし、常に、<!--s_1-->が来るとは限らないので、 (<!--s_2-->などが来ることもあります) "<!--s_1-->"."あいう"."<!--e_1-->" というような、<!--s_1-->などを明示的に指定して、文字列を 連結することはできません。 つまり、 preg_replace($strReplace,"<!--s_1-->なんと<!--e_1-->",$strString) という書き方は、できないという条件があります。

    • ベストアンサー
    • PHP
  • クーロンであるファイル名に特定文字列があるかをチェックする

    あるディレクトリ内(./)のファイルをチェックし、特定の文字列(".aaa"と"cccc"の両方)があるかをチェックし、その特定の文字列が含まれるファイルがあればあるメールアドレス宛(xxx@mmm.com)にメールを送信するスクリプトを考えています。下記スクリプトの☆☆☆のところにその関数が入ると思うのですが、自力では解決不能なためご教授願います。 <?PHP if ($dir = opendir("./")) { while (($file = readdir($dir)) !== false) { if(preg_match("/.aaa/",$file)) { if(preg_match("/cccc/",$file)) { ☆☆☆ } } } closedir($dir); } ?>

    • ベストアンサー
    • PHP
  • タグにはさまれている文字以外を置換したい

    あるマルチバイト文字列に対して、特定の文字を正規表現で置換したいのです。 そのマルチバイト文字列には、htmlの<a>タグが混じっています。(混じっていない場合もあります。) 置換したいのは、<a>タグで囲まれている文字以外の文字なのですが、正規表現としてどのようなパターンにすれば出来るのか悩んでおります。 ------------------------------------------------- //置換前のマルチバイト文字列 "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い" //検索・置換対象となる文字列 "コーヒー" //置換を行う文字列 "紅茶" //置換後のマルチバイト文字列 "朝一番の紅茶は<a href="index.html">3時のコーヒーや</a>食後の紅茶より旨い" ------------------------------------------------- ↓こちらを参考にしてみたのですが、ちょっとやりたいことと違うみたいでうまくいきませんでした。 http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside ================================================= $string = "朝一番のコーヒーは<a href="index.html">3時のコーヒーや</a>食後のコーヒーより旨い" $pattern = '/((?:\G|>)[^<]*?)コーヒー/'; $result = mb_ereg_replace($pattern, '\1紅茶', $string); echo $result; ================================================= 是非、皆様に力を貸して頂きたく、どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHPの正規表現による文字列置換について

    下記のような文字列から「abcde」のみを変数に格納したいのですが、正規表現に苦戦しています。 http://example.com/detail.php?p=abcde.php 取得したい「abcde」のみが毎回変わり、その前後は固定です。 preg_replace()を使うのがいいのだろうなと思い、いろいろやってみているのですが、 なかなかマッチさせることができません。 どうかご教示頂けますでしょうか。

    • ベストアンサー
    • PHP
  • スペースを置換するには・・・

    今日PHPを使い始めたばかりの初心者です。 「スペース」を「文字」に変換するために 下記のような正規表現を書いたのですがうまく いきません。 $xxx = ereg_replace( "\s", "aaa", $xxx ); ネットで調べまくったのですが、どこがおかしいのか よくわかりません。 アドバイスをお願いします。

    • ベストアンサー
    • PHP