簡體   English   中英

preg_match_all 用於特殊字符 [?]

[英]preg_match_all for special characters [?]

我有一個 URL:

https://my.site.com/u/0/ac?export=download&confirm=45vy&id=qNhdhk1jejhXLexLpY3RiDY2oamis">D

我想使用 preg_match_all 匹配它。 我的正則表達式是:

preg_match_all('/(https:\/\/my\.site\.com\/[u]\/[0]\/(ac)\/(?)\/.*\">D)/', $input_lines, $output_array);

但我無法匹配特殊字符? 在上面的代碼中。 我嘗試使用(?) 但它不匹配。 我知道這可能是一個蹩腳的問題,但如果有人可以幫助我匹配? 還是在 escaping 中? 在 preg_match_all 中,這會很有幫助。

我只是注意到在 ac 之后沒有/ in 鏈接,但是您在正則表達式中添加了它,所以只需嘗試刪除它或使用下面的代碼,它的工作和測試。

<?php

$input_lines = 'https://my.site.com/u/0/ac?export=download&amp;confirm=45vy&amp;id=qNhdhk1jejhXLexLpY3RiDY2oamis">D';
preg_match_all('/(https:\/\/my\.site\.com\/[u]\/[0]\/(ac)(\?).*\">D)/', $input_lines, $output_array);

var_dump($output_array);

這是 output - https://prnt.sc/weq86u

或者如果在ac/? 可能會發生,那么您可以嘗試在正則表達式中使用/作為可選參數

<?php

$input_lines = 'https://my.site.com/u/0/ac?export=download&amp;confirm=45vy&amp;id=qNhdhk1jejhXLexLpY3RiDY2oamis">D';
preg_match_all('/(https:\/\/my\.site\.com\/[u]\/[0]\/(ac)\/?(\?).*\">D)/', $input_lines, $output_array);

var_dump($output_array);

它將匹配有或沒有/ https://prnt.sc/weqbae的兩個鏈接

你的正則表達式

/(https:\/\/my\.site\.com\/[u]\/[0]\/(ac)\/(?)\/.*\">D)/
^                           ^    ^    ^   ^ ^    ^     ^
1                           2    2    3   4 5    6     1
+-- Starting delimiter      |    |    |   | |    |     +-- Ending delimiter
                            |    |    |   | |    +-- This is a greedy match and may not stop where intended
                            |    |    |   | +-- `?` is a special character in Regex and does nothing in this scenario; the .* is actually matching the `?`
                            |    |    |   +-- This slash doesn't exist
                            |    |    +-- No need for a capture group
                            +----+-- No need for a character set
  1. 正則表達式模式分隔符:

    • ...標記模式的開始和結束; 類似於標記字符串開頭和結尾的單引號/雙引號

    • 與引號一樣,如果您在模式中使用分隔符,則必須對其進行轉義

    • 為避免 escaping 您可以使用不同的分隔符

      Pattern 1: /https:\/\/www\.website\.com\/page\/1\/\index.php/ Pattern 2: ~https://www\.website\.com/page/1/index\.php~

2.由於您只想從字面上匹配字符,您可以簡單地使用模式中的字符。 如果字符可以是多個值,您只需要一個字符集

   Set       Matched value
   u    ===> u
   [u]  ===> u
   [ua] ===> u OR a
  1. 2一樣,您在這里不需要捕獲組,因為您只對捕獲整個字符串感興趣。 這會將$output_array[1] = "ac"添加到您的 output

  2. 出於某種原因,您嘗試匹配 URL 中不存在的/ ,因此該模式將永遠不會返回任何內容

  3. ? 是正則表達式中的特殊字符; 通常它用於的開頭( a ),修改量詞( b ),或暗示構造是可選的( c )。 在這種情況下(?)絕對什么都不做; .*匹配文字? 或者如果斜線不在模式中,就會這樣做。

    一個。 在組中使用? 可以表示,例如:

     (?:...) ===> Non-capturing group (?=...) ===> Positive lookahead (?....) ===> Negative lookahead

    灣。 修改量詞:通常量詞+*會是貪婪的並且盡可能匹配。 放置一個? 在它使它變得不貪婪並在第一種可能性處停止之后

    String: IIIIOIIIOIIIO Pattern Match /I.*O/ IIIIOIIIOIIIO /I.*?O/ IIIIO

    c。 使構造可選

    Pattern Match 1 Match 2 Explanation ~https?://~ http:// https:// Optional character ~(?:www\.)?website.com~ website.com www.website.com Optional non-capturing group
  4. 根據5b ,這是一個貪心量詞,因此,例如,如果模式\">D在字符串中出現多次,則匹配直到最后一次出現。

    • 即,如果您的字符串中有多個 URL ,那么它將從第一個匹配到最后一個,而不是單獨匹配它們

      String: <a href="website.com?id=2432546t4534">Link 1</a><a href="website.com?id=24345yr6787">Link 2</a> Pattern Matches ~website.com\?id=.*">~ [1] website.com?id=2432546t4534">Link 1</a><a href="website.com?id=24345yr6787"> ~website.com\?id=.*?">~ [1] website.com?id=2432546t4534"> [2] website.com?id=24345yr6787">

使固定

更新的正則表達式

~https://my\.site\.com/u/0/ac\?.*?">D~
~                                      : Starting delimiter
 https://my\.site\.com/u/0/ac          : Matches the initial part of the URL
                             \?        : Matches a literal ?
                               .*?     : Non-greedy match any character 0 or more times
                                  ">D  : Match string literally
                                     ~ : Ending delimiter

代碼

$input_lines  = 'https://my.site.com/u/0/ac?export=download&amp;confirm=45vy&amp;id=qNhdhk1jejhXLexLpY3RiDY2oamis">D';

preg_match_all('~https://my\.site\.com/u/0/ac\?.*?">D~', $input_lines, $output_array);

print_r($output_array);

Output

Array
(
    [0] => Array
        (
            [0] => https://my.site.com/u/0/ac?export=download&confirm=45vy&id=qNhdhk1jejhXLexLpY3RiDY2oamis">D
        )

)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM