PHP preg_match_all () слишком много соответствует

1

У меня есть переменная с именем $content которая содержит содержимое файла DokuWiki Markdown.

Я пытаюсь сопоставить все ссылки, в которых есть стиль: [[http://url.com/|title]]

Вот часть переменной, которую я пытаюсь сопоставить:

[[http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2FgettingStarted%2Fqs-37-3c.htm|Eclipse]], [[https://msdn.microsoft.com/en-us/library/xc3ed5eh%28v=vs.90%29.aspx|Visual Studio]] and [[https://www.jetbrains.com/idea/help/managing-bookmarks.html|IntelliJ Idea]]

Мое текущее регулярное выражение: /\[\[(.*)\|([\w\s]+?)\]\](?=\,|\s)/ но оно соответствует всей части, которую я перечислил выше, в том числе , и and.

Я хочу, чтобы каждая из ссылок была отделена, поэтому я искал результат из preg_match_all('/regular_expression/', $content, $links); является:

$links[0][0] = [[http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2FgettingStarted%2Fqs-37-3c.htm|Eclipse]]
$links[0][1] = [[https://msdn.microsoft.com/en-us/library/xc3ed5eh%28v=vs.90%29.aspx|Visual Studio]]
$links[0][2] = [[https://www.jetbrains.com/idea/help/managing-bookmarks.html|IntelliJ Idea]]

$links[1][0] = http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2FgettingStarted%2Fqs-37-3c.htm
$links[1][1] = https://msdn.microsoft.com/en-us/library/xc3ed5eh%28v=vs.90%29.aspx
$links[1][2] = https://www.jetbrains.com/idea/help/managing-bookmarks.html

$links[2][0] = Eclipse
$links[2][1] = Visual Studio
$links[2][2] = IntelliJ Idea
  • 0
    Измените: (.*) (Который слишком жадный и неточный) на: ([^|\[\]]*) .
  • 0
    Вопросы или проблемы с ответом?
Показать ещё 1 комментарий
Теги:

1 ответ

0
Лучший ответ

Я думаю, что это то, что вам нужно:

$string = '[[http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2FgettingStarted%2Fqs-37-3c.htm|Eclipse]], [[https://msdn.microsoft.com/en-us/library/xc3ed5eh%28v=vs.90%29.aspx|Visual Studio]] and [[https://www.jetbrains.com/idea/help/managing-bookmarks.html|IntelliJ Idea]]';
preg_match_all('/\[{2}(.+?)\|([\w\s]+?)\]{2}/', $string, $links);
print_r($links);

Вывод:

Array
(
    [0] => Array
        (
            [0] => [[http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2FgettingStarted%2Fqs-37-3c.htm|Eclipse]]
            [1] => [[https://msdn.microsoft.com/en-us/library/xc3ed5eh%28v=vs.90%29.aspx|Visual Studio]]
            [2] => [[https://www.jetbrains.com/idea/help/managing-bookmarks.html|IntelliJ Idea]]
        )

    [1] => Array
        (
            [0] => http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2FgettingStarted%2Fqs-37-3c.htm
            [1] => https://msdn.microsoft.com/en-us/library/xc3ed5eh%28v=vs.90%29.aspx
            [2] => https://www.jetbrains.com/idea/help/managing-bookmarks.html
        )

    [2] => Array
        (
            [0] => Eclipse
            [1] => Visual Studio
            [2] => IntelliJ Idea
        )

)

Regex101 Demo: https://regex101.com/r/iM4kG3/1

Просто нужно, чтобы ваш * был не жадным ? и вы, вероятно, хотите что-то перед этим | поэтому сделайте квантификатор a + (один или несколько); может изменить это на * если вы не заботитесь, есть ли что-нибудь там...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню