У меня есть переменная с именем $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
Я думаю, что это то, что вам нужно:
$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 +
(один или несколько); может изменить это на *
если вы не заботитесь, есть ли что-нибудь там...
(.*)
(Который слишком жадный и неточный) на:([^|\[\]]*)
.