regex — пытается получить текст только внутри кавычек

Я пытаюсь сделать команду 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, но мог заставить все работать правильно.

Любая помощь высоко ценится!

4

Решение

Если вы знаете, что он будет в этом формате, вы можете использовать что-то вроде этого:

(\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+), "один или несколько персонажей без жадности, затем другой ",

4

Другие решения

Используйте следующее регулярное выражение

(.*?)\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
)
*/
2

Еще один подход:

<?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"
?>
0

Я не использую 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
0
По вопросам рекламы [email protected]