2017-04-17 8 views
1

正規表現に関する質問があります。つまり、PHPで動作する構文です。 私はPHPで正規表現に関するいくつかの基本を知っているので、私は、私は今、私がでスペースで区切ってすることができ、オプションのいくつかの単語が含まれているすべてのテキストを一致させたいスペースで区切られた特定の単語のPHPリクエスト

preg_match("/[maxmustermann ]/u", $input_line, $output_array); 

で何かを一致させることができることを知っています。

申し訳ありません申し訳ありません。私は例を挙げてみる。私はこのテキストを持っていて、すべての大胆なものと一致させたい。

オレムのイプサムの悲しみは、最大 adipiscingのELIT consectetur、AMET座ります。プロペンmaxm pellentesque dui maxmustermann eu erat mustermann rhoncus tempor sit amet quis odio。 最大Mustermann居住者morbi tristique senectus et netus et malesuada fames ac turpis egestas。 Max Muster Mann et felsibusのmalesuada fames ac ante ipsum primis。 Nam vitae nisl dui。どの順番で最大および/またはmustermannの文字を含む最大mustermannと私は言葉(1つ以上)を合わせたい:私はこの二つの言葉を持っていることを意味し

それらはランダムな配置スペースでもあります。

は、あなたがこの正規表現を使用して、大文字と小文字を区別しない試合をしたいあなたに

+1

について説明しましたか? – anubhava

答えて

2

正規表現ではできません。選択した文字で構成されたすべての単語を最初に抽出し、次にこれらの単語をフィルタリングする必要があります。

$word = 'maxmustermann'; 
preg_match_all('~\b[aemnrstux]+\b~ui', $txt, $matches); 

$result = array_filter($matches[0], function ($i) use ($word) { 
    return stripos($word, $i) !== false; 
}); 

demo

あなたは、交換を行いたい場合は、同様の方法を続行することができます:

$word = 'maxmustermann'; 
$result = preg_replace_callback('~\b[aemnrstux]+\b~ui', function ($m) use ($word) { 
    return stripos($word, $m[0]) !== false ? "#{$m[0]}#" : $m[0]; 
}, $txt); 

demo

+0

ありがとうございます、それは素晴らしいです –

1

ありがとう:

/(max)|(muster)|(mann)/i 

EXAMPLE

EDIT:指摘し@AbraCadaverのおかげであなたもpreg_match_all()

が必要になります
+0

'preg_match_all'も必要です。 – AbraCadaver

1

編集更新:

このような何か

質問を読んだ後、これは修正された答えです。
以下の正規表現を使用してpreg_match_allを実行してください。

OP基準:

私はによって スペースで区切ってすることができ、オプションのいくつかの単語が含まれているすべてのテキストを一致させたいです。 ...

の中にmaxや/またはmustermannの文字を含む言葉(1つ以上)をマッチさせたいのですが、ランダムな配置スペースもあります。

このため、空白境界を使用する必要があります。
すべての項目の部分文字列は、別の単語境界で並べられます。

この正規表現は、空白で区切られた部分文字列のグループにも一致します。

(?i)(?<!\S)(?!\s)(?:m|\b)(?:a|\b)(?:x|\b)(?:m|\b)(?:u|\b)(?:s|\b)(?:t|\b)(?:e|\b)(?:r|\b)(?:m|\b)(?:a|\b)(?:n|\b)(?:n|\b)(?:\s+(?!\s)(?:m|\b)(?:a|\b)(?:x|\b)(?:m|\b)(?:u|\b)(?:s|\b)(?:t|\b)(?:e|\b)(?:r|\b)(?:m|\b)(?:a|\b)(?:n|\b)(?:n|\b))*(?!\S)

101 demo

ベンチマーク

Regex1: (?i)(?<!\S)(?!\s)(?:m|\b)(?:a|\b)(?:x|\b)(?:m|\b)(?:u|\b)(?:s|\b)(?:t|\b)(?:e|\b)(?:r|\b)(?:m|\b)(?:a|\b)(?:n|\b)(?:n|\b)(?:\s+(?!\s)(?:m|\b)(?:a|\b)(?:x|\b)(?:m|\b)(?:u|\b)(?:s|\b)(?:t|\b)(?:e|\b)(?:r|\b)(?:m|\b)(?:a|\b)(?:n|\b)(?:n|\b))*(?!\S) 
Completed iterations: 50/50  (x 1000) 
Matches found per iteration: 6 
Elapsed Time: 10.42 s, 10421.84 ms, 10421843 µs 

は `` maxm`に一致max`れる方法

(?i)     # Case insensitive modifier 
(?<! \S)    # Whitespace boundary behind 
(?! \s)    # Insure one of the next substrings match 

(?: m | \b) 
(?: a | \b) 
(?: x | \b) 
(?: m | \b) 
(?: u | \b) 
(?: s | \b) 
(?: t | \b) 
(?: e | \b) 
(?: r | \b) 
(?: m | \b) 
(?: a | \b) 
(?: n | \b) 
(?: n | \b) 

(?: 
     \s+     # Optional space and more words 
     (?! \s)    # Insure one of the next substrings match 
     (?: m | \b) 
     (?: a | \b) 
     (?: x | \b) 
     (?: m | \b) 
     (?: u | \b) 
     (?: s | \b) 
     (?: t | \b) 
     (?: e | \b) 
     (?: r | \b) 
     (?: m | \b) 
     (?: a | \b) 
     (?: n | \b) 
     (?: n | \b) 
)* 
(?! \S)    # Whitespace boundary ahead 
+0

このsytanxの説明をありがとうございますが、* maxm *の単語をキャッチしません。 –

+0

@AllanKarlson - 純正の正規表現ソリューションを追加しました。これはおそらくそれを行うより速い方法です(ただし、タスクはそれがどのように行われても本質的に遅いです)。 – sln

+0

@sin wowそれは素晴らしいです。ありがとうございました! –

関連する問題