1

PHPを使用して電子メールを解析していて、特定の文字列の後に番号を取得したい場合:たとえば、この文字列から番号033を取得したい場合:

 Account Number: 033 
 Account Information: Some text here

アカウント番号:という単語が常にあり、次に番号、そして改行があります。私は持っています:

 preg_match_all('!\d+!', $str, $matches);

しかし、それはすべての数字を取得します...

どんな助けでも素晴らしいでしょう!ありがとう

編集:

テキストはHTMLです...これが問題になる可能性があります。

    <font face="Arial, Helvetica, sans-serif" color="#000099"><strong><font color="#660000">Account 
     Number</font></strong><font color="#660000">: 033<br>
    <strong>Account Name</strong>: More text here<br>
4

4 に答える 4

11

番号が常に後ろにある場合Account Number: (最後のスペースを含む)、それを正規表現に追加します。

preg_match_all('/Account Number: (\d+)/',$str,$matches);
// The parentheses capture the digits and stores them in $matches[1]

結果:

$matches Array:
(
    [0] => Array
        (
            [0] => Account Number: 033
        )

    [1] => Array
        (
            [0] => 033
        )

)

注: HTMLが存在する場合は、HTMLが変更される可能性があると思わない限り、正規表現に含めることができます。それ以外の場合は、 HTML DOMパーサーを使用して文字列のプレーンテキストバージョンにアクセスし、そこから正規表現を使用することをお勧めします。

そうは言っても、以下は正規表現にHTMLを含み、上記と同じ出力を提供する例です。

// Notice the delimiter 
preg_match_all('@<font face="Arial, Helvetica, sans-serif" color="#000099"><strong><font color="#660000">Account 
Number</font></strong><font color="#660000">: (\d+)@',$str,$matches);
于 2013-03-23T00:11:30.777 に答える
3
$str = 'Account Number: 033 
 Account Information: Some text here';

preg_match('/Account Number:\s*(\d+)/', $str, $matches);

echo $matches[1]; // 033

使用する必要はありませんpreg_match_all()。また、括弧内に一致を配置することにより、一致を後方参照に入れませんでした。

于 2013-03-23T00:12:20.990 に答える
1

HTMLをベースとして:

$str = '<font face="Arial, Helvetica, sans-serif" color="#000099"><strong><font
    color="#660000">Account Number</font></strong><font color="#660000">: 033<br>
    <strong>Account Name</strong>: More text here<br>';
preg_match_all('!Account Number:\s+(\d+)!ims', strip_tags($str), $matches);
var_dump($matches);

そして私達は得る:

array(2) {
    [0]=>
    array(1) {
        [0]=>
        string(19) "Account Number: 033"
    }
    [1]=>
    array(1) {
        [0]=>
        string(3) "033"
    }
}
于 2013-03-23T00:45:00.407 に答える
0

@montesはstrip_tags()、正規表現を使用してターゲットの部分文字列を抽出する前に、入力テキストをサニタイズ/簡略化するために適切に呼び出しています。ただし、このパターンでは多少の改良が必要であり、電子メールごとにアカウント番号が1つしかない場合は、を使用するべきではありませんが、を使用する必要がありpreg_match_all()ますpreg_match()

  • 大文字と小文字を区別する必要がないため、iパターン修飾子には意味がありません。
  • パターンにはメタ文字がないため^、パターン修飾子は役に立ちません。$m
  • パターンにはメタ文字がない.ため、sパターン修飾子は役に立ちません。
  • \Kフルストリングマッチを再開します。これは、キャプチャグループを使用する必要がなくなるため有益です。

コード:(デモ

$html = '<font face="Arial, Helvetica, sans-serif" color="#000099"><strong><font
    color="#660000">Account Number</font></strong><font color="#660000">: 033<br>
    <strong>Account Name</strong>: More text here<br>';

echo preg_match('~Account Number:\s*\K\d+~', strip_tags($html), $match)
     ? $match[0]
     : 'No Account Number Found';

出力:

033
于 2020-08-28T08:37:51.030 に答える