0

重複の可能性:
正規表現 / Preg: 見つかった場合は一致しません

preg_replace文字列に何かがない場合、文字列を置き換えるために使用したいと思います。つまり、部分文字列が存在する場合、文字列は一致しません。

たとえば、文字列に が含まれている場合、.png検索/一致しません。

example.com/image.png

ここでは、文字列に line/substring が含まれているため、検索されません.png

example.com/image

ここでは、文字列に行/部分文字列がどこにも含まれていないため、それが見つかります。.png


まだ私を理解していない人のために。

$result = preg_replace("#http://(.*\S)[Something here that will not match the link if it finds the .png at last]#","<a href='\\1'>\\1</a>","Here is a link that should work http://example.com/; Here is a link that should NOT work http://example.com/image.png")
4

3 に答える 3

1

OK、私はここで手足に出かけます。

まず、URLを見つける正規表現が必要です。明らかに多くの無効なURLも見つけたいので、シーケンスを含む連続する非スペース文字の文字列を単純に考慮する正規表現を使用します<letter>.<letter>

\b(?=\S*[a-z]\.[a-z])\S+(?=\s|$)

.png次に、このシーケンスが:で終わっていないことを確認できます。

\b(?=\S*[a-z]\.[a-z])\S+(?=\s|$)(?<!\.png)

これで、たとえば、置換操作に使用できます。

$result = preg_replace(
    '/\b           # Start at a word boundary
    (?=            # Assert that it\'s possible to match...
     \S*           # any number of non-whitespace characters
     [a-z]\.[a-z]  # followed by an ASCII letter, a dot, a letter
    )              # End of lookahead assertion
    \S+            # Match one or more non-whitespace characters
    (?=\s|$)       # until the next whitespace or end of string
    (?<!\.png)     # unless that match ends in .png/ix', 
    '<a href="\0">\0</a>', $subject);
于 2012-09-16T15:49:18.833 に答える
0

これはどう:

$yourInputString = 'whatever';
$matchPattern = '/^.*?(?<!\.png)$/i';
$replacePattern = '$0.png';
$result = preg_replace($matchPattern, $replacePattern, $yourInputString);

入力文字列には、処理中のリンクのみを含める必要があることに注意してください。

example.com/image.png

また

example.com/image

パターンの説明は次のとおりです。

# ^.*?(?<!\.png)$
# 
# Options: case insensitive
# 
# Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
# Match any single character that is not a line break character «.*?»
#    Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
# Assert that it is impossible to match the regex below with the match ending at this position (negative lookbehind) «(?<!\.png)»
#    Match the character “.” literally «\.»
#    Match the characters “png” literally «png»
# Assert position at the end of a line (at the end of the string or before a line break character) «$»
于 2012-09-16T15:55:28.743 に答える
0

これは私が問題にアプローチする方法です。「not」RegExpを機能させるのはかなり難しいです-システムが実際に設計されたものではないためです。したがって、代わりにロジックを分離して、2 つの RegExps を持つようにします... 1 つはリンクのような構造を検索し、もう 1 つは回避したいケースをチェックします。

function replaceWithLink ( $find ) {
  list($link) = $find;
  if ( preg_match('/\.(png|gif|image)$/', $link) ) {
    return $link;
  }
  else {
    return '<a href="'.$link.'">'.$link.'</a>';
  }
}

$text = 'This is my test string that contains a url.like/thing but '.
        'it also contains another url.like/thing/that-has-an.image '.
        'should they all be highlighted?';

$expr = '#[a-z0-9:_\-\.]+/[a-z0-9_\-\./]+#i';
$func = 'replaceWithLink';

$text = preg_replace_callback($expr, $func, $text);

上記は、過度に複雑な RegExp を 1 つ持つよりも読みやすく、より多くの拡張機能を処理するために簡単に拡張できます。明らかに、これを URL で適切に機能させるには、それらを検索する RegExp を微調整する必要があるかもしれません。私のバージョンでは、修飾するために、URL に 、その後に、URL-like text続いて を含める必要があります。/URL-like text possibly with slash

于 2012-09-16T15:45:27.127 に答える