2
preg_match('/.*MyString[ (\/]*([a-z0-9\.\-]*)/i', $contents, $matches);

これをデバッグする必要があります。私はそれが何をしているのかよく知っていますが、私は正規表現の専門家ではなかったので、あなたの助けが必要です.

ブロックごとに何をするのか教えてもらえますか (学習できるように)。

構文を簡略化できますか (ドットをスラッシュでエスケープする必要はないと思います)。

4

2 に答える 2

3

正規表現...

'/.*MyString[ (\/]*([a-z0-9\.\-]*)/i'

.*任意の文字に 0 回以上一致する

MyStringその文字列に一致します。ただし、大文字と小文字を区別しない一致を使用しているため、一致した文字列は「mystring」と綴られますが、大文字は使用されます

編集: (アラン・ムーアに感謝) [ (\/]*. space (これは、任意の文字または/0 回以上繰り返された文字に一致します。Alan が指摘するように、 の最終的なエスケープは、正規表現区切り文字として扱われるの/を止めることです。/

編集:はエスケープする必要がなく、(AlexV に感謝)も必要あり(ません。.

\、-、^ (先頭) および末尾の ] 以外のすべての英数字以外の文字は、文字クラスでは特殊文字ではありませんが、エスケープしても害はありません。-- http://www.php.net/manual/en/regexp.reference.character-classes.php

通常、ハイフンはエスケープする必要があります。そうしないと、範囲を定義しようとします。例えば:

[A-Z]  // matches all upper case letters of the aphabet
[A\-Z] // matches 'A', '-', and 'Z'

ただし、ハイフンがリストの最後にある場合は、エスケープしなくても問題ありません (ただし、常にエスケープする習慣を身に付けるのが最善です... 私はこれに巻き込まれました].

([a-z0-9\.\-]*)は、a から z までの文字 (大文字と小文字を区別しない一致によって影響を受けることに注意してください)、0 から 9、ドット、ハイフンを含む任意の文字列に一致し、0 回以上繰り返されます。周囲()はこの文字列をキャプチャします。これは、$matches[1]によって一致する文字列が含まれることを意味し[a-z0-9\.\-]*ます。括弧は、この文字列を「キャプチャ」するように()指示します。preg_match

例えば

<?php
  $input = "aslghklfjMyString(james321-james.org)blahblahblah";
  preg_match('/.*MyString[ (\/]*([a-z0-9.\-]*)/i', $input, $matches);
  print_r($matches);
?>

出力

Array
(
    [0] => aslghklfjMyString(james321-james.org
    [1] => james321-james.org
)

大文字と小文字を区別しない一致を使用しているため、注意してください...

$input = "aslghklfjmYsTrInG(james321898-james.org)blahblahblah";

も一致し、同じ答えを返します$matches[1]

お役に立てれば....

于 2013-05-17T14:26:55.740 に答える
1

Let's break this down step-by step, removing the explained parts from the expression.

"/.*MyString[ (\/]*([a-z0-9\.\-]*)/i"

Let's first strip the regex delimiters (/i at the end means it's case-insensitive):

".*MyString[ (\/]*([a-z0-9\.\-]*)"

Then we've got a wildcard lookahead (search for any symbol any number of times until we match the next statement.

"MyString[ (\/]*([a-z0-9\.\-]*)"

Then match 'MyString' literally, followed by any number (note the '*') of any of the following: ' ', '(', '/'. This is probably the error zone, you need to escape that '('. Try [ (/].

"([a-z0-9\.\-]*)"

Then we get a capture group for any number of any of the following: a-z literals, 0-9 digits, '.', or '-'.

That's pretty much all of it.

于 2013-05-17T14:25:25.697 に答える