正規表現でタグ以外のアルファベットに一致させる方法

このQ&Aのポイント
  • 正規表現を使って、タグで囲まれた文字列以外のアルファベットに一致させる方法について教えてください。
  • 例えば、HTMLの文字列からタグで囲まれた部分以外のアルファベットにマッチさせたいです。
  • 試行錯誤してみましたが、うまくいかないので助けが必要です。
回答を見る
  • ベストアンサー

正規表現について

タグで囲まれた文字列以外に含まれるアルファベットに一致させたいのですがうまくいかず困ってます。 例えば以下のようなHTMLの文字列があったとします。 ---------------------------------------------------------------------------- PHP: Hypertext Preprocessorとは、動的にHTMLデータを生成することによって、動的なウェブページを実現することを主な目的としたプログラミング言語、およびその言語処理系である。<br> 詳しくは以下のURLを参照されたし。<br> <a href="http://ja.wikipedia.org/wiki/PHP:_Hypertext_Preprocessor">リンク</a> ---------------------------------------------------------------------------- "PHP: Hypertext Preprocessor"と"URL"と"HTML"の部分だけに一致させて <br>や<a>などタグで囲まれた部分に含まれるアルファベットや記号には一致しないようにしたいのです。 いろいろ試してみましたが、どうにもうまくいきません。 どなたかお助けください><

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

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

  • ベストアンサー
noname#244856
noname#244856
回答No.3

ノイズが混じらないようにした改良版 function get_keywords($text) { ____ ____$pattern = '/[\\w!"#$%&\'()=~^\\\\|`@[{+;*:}\\]<,>.?\\/ -]++/'; ____preg_match_all($pattern, strip_tags($text), $matches); ____return array_filter(array_map(function ($i) { ________return trim($i, '!"#$%&\'()=~^\\|`@[{+;*:}]<,>.?/ -'); ____}, $matches[0]), 'strlen'); ____ } http://ideone.com/FzUzTd

その他の回答 (2)

noname#244856
noname#244856
回答No.2

「タグに囲まれた部分」の解釈の仕方で大きく変わってきますが・・・ ※ UTF-8前提 【A. タグとその属性にマッチさせたくない場合】 function get_keywords($text) { ____ ____$pattern = '/[\\w!"#$%&\'()=~^\\\\|`@[{+;*:}\\]<,>.?\\/ -]++/'; ____preg_match_all($pattern, strip_tags($text), $matches); ____return $matches[0]; ____ } 動作テスト http://ideone.com/6LHwfU 【B. タグとその属性・特定タグの内部テキストにマッチさせたくない場合】 Simple HTML DOM Parser を利用します。 http://simplehtmldom.sourceforge.net/ function get_keywords($text, $forbidden_tags = array()) { ____ ____$html = str_get_html($text); ____foreach ($forbidden_tags as $tag) { ________foreach ($html->find($tag) as $e) { ____________$e->innerText = ''; ________} ____} ____$pattern = '/[\\w!"#$%&\'()=~^\\\\|`@[{+;*:}\\]<,>.?\\/ -]++/'; ____preg_match_all($pattern, strip_tags((string)$html), $matches); ____return $matches[0]; ____ }

kyotokyo
質問者

お礼

丁寧な回答ありがとうございます。非常に参考になりました。 リンク先のideaone.comというサイトですが初めて知りました。 コードとその結果を表示出来るんですね。いろいろと丁寧にありがとうございます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

<a href="・・・">abc</a> となっていた場合abcはマッチしたくないのでしょうか? もしそうなるとhtml文章はhtmlタグやbodyタグに囲まれているので 一つもヒットしませんね また例示の「PHP: Hypertext Preprocessor」は 記号「:」やスペースを含みます。どこまでマッチさせたいのか決めないと 思わぬものまでマッチしたり、意図したものがマッチしなかったりしますよ? たとえばスペースにマッチさせると無駄な空白を全て抜き出しますし &amp;的なエスケープ文字が記載されていると「amp」だけマッチしたりします

kyotokyo
質問者

補足

確かにそうですね。説明がへたですいません。

関連するQ&A

  • Perlの正規表現でマッチする範囲を限定

    例えば、以下のようなことがしたいのですが可能でしょうか? 変数$bufに複数行の文字列が入っていたとしてこのうち、 タグとエレメント外を対象にしてマッチさせる (例として以下のような文字列にしたい) <a href="abcdef">abcdef</a><br> <b>abc</b>defabcdef<br> abcdef<b>abcdef</b><br> ↓(タグとエレメント外の文字aを<b>a</b>に置き換える) <a href="abcdef">abcdef</a><br> <b>abc</b>def<b>a</b>bcdef<br> <b>a</b>bcdef<b>abcdef</b><br> 実際にはこのときのマッチの対象となる文字と文字数は可変で bになるかもしれないですしabとかになるかもしれません。 ネット上で検索していろいろ試してみたのですが惜しい ところまではいっても完全に正しく動作しませんでした。 (タグやエレメントの中身に反応してしまったり一部分が 置き換えされなかったり<br>タグの後ろが<b></b>のように なったり) 良いアドバイスください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 【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
  • 正規表現

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

  • 正規表現を用いてHTML内の文字列を抜き出したいのですが・・・

    PHPの正規表現を用いて外部Webページのソース内にある文字列を抜き出してきたいのですがうまくいきません。 例えば、 <td class="nml">食べてきれいにやせる! 伊達式脂肪燃焼ダイエット / 伊達友美<br></td> のようなタグに挟まれた文字列を抜き出します。自分で書いたプログラムは以下の通りです。 <?php //外部URL $fp = fopen("特定のURL", "r"); while(!feof($fp)){ //HTMLソースを全文取得 $line = fgets($fp, 1024); //各行を配列に格納 $line_array[] = $line; } //配列を一つの文字列に変換 $line_text = implode("", $line_array); if(preg_match_all('ここの部分が思いつきません', $line_text, $match)){ print $match; }else{ print 'マッチしません'; } ?> 色々と調べて試行錯誤しましたが、結局うまくいきませんでした。 正規表現となる部分をどなたかご教授頂けないでしょうか。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 【PHP 正規表現を使って文字列を抽出】

    いつもお世話になっております。 正規表現で行き詰っており、お知恵を拝借したいと 思います。 説明がわかりづらいかと思いますが、何卒ご教授お願いしたいと思います。 【↓こういった文字列から】 <img src="http://localhost/uploads/abc123.jpg" align="left" alt="" /><br /> <img src="http://localhost/uploads/def456.jpg" align="left" alt="" /><br /><br />日本語文字列や英語・数字など<br /><br /> imgタグが複数、HTMLタグ、日本語文字列が混ざった ものから、URLは複数あるのでURL毎に配列で取得し、 日本語文字列は日本語文字列だけで取得したいと思います。 最終的にこういうことができたらいいです・・。 $array[0]="http://localhost/uploads/abc123.jpg"; $array[1]="http://localhost/uploads/def456.jpg"; $damy="日本語文字列などなど"; 恥ずかしながら、私には複雑すぎて 全く分かりませんでした。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現での複数箇所の文字列置換について

    文字列から特定の文字を検出し、 HTMLタグに置換するスクリプトを作成しようとしています。 例: 元の文字列:xxxxxx[id:1]xxxx[id:2]xxxx  ↓ 置換後の文字列: xxxxxx (<A>タグによるリンク。idが1番のタイトルをDBから参照) xxxx (<A>タグによるリンク。idが2番のタイトルをDBから参照) xxxx 要求している処理順序:  1:文字列中から[id:xxx]を検出して<A>タグに変換  2:id:xxx の xxx部分(数字)を抽出  3:2で得た数字でSQLを実行  4:DBから得た文字列で<A>タグを完成    <A href="test.php?id=(2で得た数字)">(4で得た文字列)</A>  5:以上を[id:xxx]の個数分だけ繰り返し --- スクリプト: // 文字列 $str = "xxxxxx<br>[id:1]<br>xxxx<br>[id:2]<br>xxxx"; // 置換 $result = ereg_replace("\[id:([0-9]+)\]","<a href=\"test.php?id=\\1\">xxx</a>"; ここで、id: の次に続く数字を抽出して その数字を元にDBからデータを引っ張ってこようと思ってます。 // 抽出 $pregresult = preg_match("/[0-9]+/",$result,$match); $id = $match[0]; ここで $id に番号が入り、その番号でSQL文を作成したいのですが 文字列中に[id:xxx]がひとつだけなら正常に動作するのですが 二つ以上存在する場合、$id には最初に検出された数字(上記例では 1 ) しか入ってこないので、二つ目以降のidが認識できず困ってます。 複数の検出・置換対象を順次処理していく方法があれば ご教示いただければ幸いです。 もしくは、他にもっとスマートな方法があるのであれば ご提示いただければ幸いです。 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現 での置換処理について

    こんばんは。 納期が迫ってきていて、頭が回らず、こちらに質問させていただきます>< 「HTMLタグが含まれた文章」 を処理します。 その中の <img~> <br> <hr> タグを <img~/> <br /> <hr /> に置換したいのです。 /の前には半角のスペースが1文字入るようにしたいです。 また、もし上記タグで、最初から終了タグが含まれていた場合は処理対象外にしたいです。 もしも <br /> があれば、それは終了タグがついているので処理しない。 納期前にモバイルページ(XHTML)での確認をしたら 終了タグがなくてあわててしまいました。 どうかお力をお貸しください。よろしくお願いいたします。 PHPのバージョンは5.1です。

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

    その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
  • 独習PHP 例題についてです。

    <?php $str = 'PHP (PHP:Hypertext Preprocessor)'; $msg = <<<EOD {$str}は、サーバサイドで動作する簡易なスクリプト言語です。 まずは、。本書でじっくり基礎を固めましょう。<br /> "Let's start、 everyone!!" EOD; print $msg; なぜエラーが取れないのでしょうか?

    • ベストアンサー
    • PHP
  • PHPってなんの略?

    既出の質問かもしれませんが、検索キーワードが普通の単語しか思い浮かばず、ヒットできませんでした。 PHPってなんの略ですか? どうやら、 PHP:Hypertext Preprocessor とのことらしいのですが、頭文字をとると、最初のPが足りません。 Protocol Hypertext Preprocessor って事ですか? それとも、アナグラムなんでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう