Я пытаюсь сделать команду Slack slash используя скрипт PHP.
Поэтому, когда я печатаю:
/save someurl.com "This is the caption"
Я могу преобразовать эту строку в две разные переменные.
Длинная строка будет выглядеть так:
https://someurl.com "This is the caption"
Я хочу иметь возможность превратить это в:
$url = https://someurl.com;
$caption = This is the caption;
Я пробовал некоторые шаблоны регулярных выражений из предыдущего поиска здесь, на Stack Overflow, но мог заставить все работать правильно.
Любая помощь высоко ценится!
Если вы знаете, что он будет в этом формате, вы можете использовать что-то вроде этого:
(\S+)\s+"(.+?)"
Образец кода:
$string = 'someurl.com "This is the caption"';
preg_match('~(\S+)\s+"(.+?)"~', $string, $matches);
var_dump(
$matches
);
Выход:
array(3) {
[0] =>
string(33) "someurl.com "This is the caption""[1] =>
string(11) "someurl.com"[2] =>
string(19) "This is the caption"}
Это работает путем сопоставления одного или нескольких непробельных символов ((\S+)
), один или несколько пробельных символов (\s+
), "
один или несколько персонажей без жадности, затем другой "
,
Используйте следующее регулярное выражение
(.*?)\s"(.*?)"
Затем используйте соответствующие группы, чтобы получить то, что вы хотите.
Пример :
$string = 'https://someurl.com "This is the caption"';
preg_match('/(.*?)\s"(.*?)"/', $string, $matches);
print_r($matches);
/* Output:
Array
(
[0] => https://someurl.com "This is the caption"[1] => https://someurl.com
[2] => This is the caption
)
*/
Еще один подход:
<?php
$string = 'https://someurl.com "This is the caption"';
$regex = '~\s+(?=")~';
# looks for a whitespace where a double quote follows immediately
$parts = preg_split($regex, $string);
list($url, $caption) = preg_split($regex, $string);
echo "URL: $url, Caption: $caption";
// output: URL: https://someurl.com, Caption: "This is the caption"
?>
Я не использую Slack, но если возможно ввести что-то вроде:/save someurl.com "This is a \"quote\" in the caption"
В результате получается длинная строка:
https://someurl.com "This is a \"quote\" in the caption"
Тогда ленивый шаблон, ищущий двойную кавычку, потерпит неудачу.
Независимо от этого, жадные шаблоны более эффективны, чем ленивые, поэтому я бы порекомендовал следующее для всех сценариев:
~(\S+) "(.+)"~
Код: (демонстрация)
$input = 'https://someurl.com "This is a \"quote\" in the caption"';
list($url, $caption)=(preg_match('~(\S+) "(.+)"~', $input, $out) ? array_slice($out,1) : ['','']);
echo "url: $url\ncaption: $caption";
Выход:
url: https://someurl.com
caption: This is a \"quote\" in the caption