web-dev-qa-db-ja.com

strpos()の文字列で正規表現を使用する

$ open_email_msgを検索するスクリプトを取得したいのですが、電子メールごとに情報は異なりますが、フォーマットは同じです。

私は実際には正規表現をあまり使用していませんが、「タイトル:[タイトルのデータ]」、「カテゴリ:[カテゴリのデータ]」を検索する文字列を検索するときはいつでもしたいのです。私は何かのようなことを考えていないので

strpos($open_email_msg, "Title: (*^)"); 

うまくいくだろう。

これはコード全体のほんの一部です。残りは情報をMySQLテーブルに挿入し、サイトのニュース記事に投稿されます。

誰かがこれの解決策を見つけるのを手伝ってくれる?

厳格な電子メールメッセージの形式:

ニュースの更新
タイトル:記事のタイトル
タグ:tag1 tag2
カテゴリ:記事カテゴリ、2番目の記事カテゴリ
スニペット:記事のスニペット。
メッセージ:記事メッセージ。画像。より多くのテキスト、より多くのテキスト。 Lorem impsum dolor sit amet。

<?php
    //These functions searches the open e-mail for the the prefix defining strings.
        //Need a function to search after the space after the strings because the subject, categories, snippet, tags and message are constant-changing.
    $subject = strpos($open_email_msg, "Title:");       //Searches the open e-mail for the string "Title" 
        $subject = str_replace("Title: ", "" ,$subject);
    $categories = strpos($open_email_msg, "Categories:");       //Searches the open e-mail for the string "Categories"
    $snippet = strpos($open_email_msg,"Snippet");           //Searches the open e-mail for the string "Snippet"
    $content = strpos($open_email_msg, "Message");  //Searches the open-email for the string "Message"
    $tags = str_replace(' ',',',$subject); //DDIE
    $uri =  str_replace(' ','-',$subject); //DDIE
    $when = strtotime("now");   //date article was posted
?>
18

PREG_OFFSET_CAPTUREpreg_matchフラグを使用してみてください。このようなもの:

preg_match('/Title: .*/', $open_email_msg, $matches, PREG_OFFSET_CAPTURE);
echo $matches[0][1];

これにより、文字列の最初の位置がわかります。

私が使用している正規表現は間違っている可能性があり、行末などを考慮に入れていない可能性がありますが、それは別の問題です。 :)

[〜#〜]編集[〜#〜]。あなたが望むもののためのより良い解決策(私がそれを正しく理解しているなら)は次のようなものです:

$title = preg_match('/Title: (.*)/', $open_email_msg, $matches) ? $matches[1] : '';

次に、タイトルを$title変数に取得し、タイトルが見つからなかった場合は空の文字列を取得します。

21
cambraca

正規表現にstrposの代わりにpreg_matchを使用できます

preg_match (regex, $string, $matches, PREG_OFFSET_CAPTURE);

PREG_OFFSET_CAPTURE gives you the position of match.
8
Shraddha