2016-02-10 4 views
4

Im пытается сделать команду Slack slash с помощью скрипта PHP.PHP - попытка получить текст только внутри кавычек

Так что, когда я типа:

/save someurl.com "This is the caption" 

я могу преобразовать эту одну строку в двух различных переменных.

Длинная строка будет приходить как:

https://someurl.com "This is the caption" 

Я хочу быть в состоянии превратить это в:

$url = https://someurl.com; 
$caption = This is the caption; 

Я пробовал некоторые регулярные выражения из предыдущего поиске здесь на переполнение стека но может заставить все работать правильно.

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

ответ

2

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

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

Demo.

Это работает путем сопоставления одного или более не-пробельных символов ((\S+)), один или несколько пробельных символов (\s+), а ", один или несколько символов в не жадный моды, то другой ".

+0

Подпись, возвращаемая вашим регулярным выражением, выглядит следующим образом: ' $ slackMessage =" '". $ _POST ['text']. "'"; $ regexPattern = '~ (\ S +) \ s + (. +) ~'; preg_match ($ regexPattern, $ slackMessage, $ matches); $ link = $ matches [1]; $ title = $ matches [2]; ' –

+0

@MattLewis Ваш последний комментарий не показывает проблему, но (из ваших теперь удаленных комментариев) похоже, что у вас есть смарт-цитата из Юникода, а не прямая нормальная цитата. Самый простой способ обойти это - использовать это регулярное выражение: '(\ S +) \ s + \ S (. +?) \ S'. Пожалуйста, попробуйте это и сообщите мне, если это сработает. –

+0

Я получаю сообщение об ошибке: 'preg_match(): Неизвестный модификатор '\'' $ regexPattern = '(\ S +) \ s + \ S (. +?) \ S'; –

0

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

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

Я не использую слабину, но если это возможно, чтобы ввести что-то вроде:
/save someurl.com "This is a \"quote\" in the caption"

, причиненный в результате в этой длинной строке:
https://someurl.com "This is a \"quote\" in the caption"

Тогда ленивый шаблон, ищущий двойную цитату, не удастся.

Независимо от того, что жадные модели являются более эффективными, чем ленивых, так что я бы рекомендовать для всех сценариев:

~(\S+) "(.+)"~ 

Код: (Demo)

$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 
Смежные вопросы