Мне нужно найти способ взорвать определенную строку, в которой есть кавычки

У меня серьезные проблемы с этим, и я не достаточно опытен, чтобы понять, как мне это делать.

Для начала у меня есть очень длинная строка, известная как $ VC. Каждый раз это немного отличается, но всегда будет что-то одинаковое.
$VC является htmlspecialchars() строка, которая выглядит как

<a href="example.com?continue=pid%3D6057413202557366578%26oid283447094297409">Example Link</a>... Lots of other stuff in between here... 80] ,[] ,"","3245697351286309258",[] ,["812750926... and it goes on ...80] ,[] ,"","6057413202557366578",[] ,["103279554... and it continues on

В этом случае <a> тег всегда один и тот же, поэтому я беру информацию оттуда. Числа, перечисленные после него, такие как ,"3245697351286309258",[] а также ,"6057413202557366578",[] также всегда будет в том же формате, просто разные номера, и один из этих номеров всегда будет иметь определенный идентификатор.
Затем я нахожу тот конкретный идентификатор, который я хочу, я всегда хочу этот номер внутри pid%3D а также %26oid,

$pid = explode("pid%3D", $VC, 2);
$pid = explode("%26oid", $pid[1], 2);
$pid = $pid[0];

В этом случае это число 6057413202557366578, Далее я хочу взорвать $ VC таким образом, чтобы я мог поместить все после ,"6057413202557366578",[] в переменную как свою собственную строку.

Здесь вещи начинают разрушаться. Что я хочу сделать, это следующее

$vinfo = explode(',"'.$pid.'",[]',$VC,2);
$vinfo = $vinfo[1]; //Everything after the value I used to explode it.

Естественно, я действительно огляделся и попробовал другие вещи, такие как preg_split и preg_replace, но должен признать, что это вне меня, и, насколько я могу судить, они не позволяют вам поместить свою собственную переменную в середину. (например ',"'.$pid.'",[]').

Если я полностью понимаю идею регулярного выражения, могут возникнуть и другие проблемы, связанные с тем, что если я буду искать его без переменной $ pid (например, только окружающие символы), он подберет аналогичные части строки, прежде чем доберется до тот, который я хочу, (например, ,"3245697351286309258",[]).

Я надеюсь, что я объяснил это достаточно хорошо, но главный вопрос — как я могу получить информацию после этой конкретной части строки (',"'.$pid.'",[]') в переменную?

0

Решение

Я надеюсь, что это делает то, что вы хотите:

pid%3D(?P<id>\d+).*?"(?P=id)",\[\](?P<vinfo>.*?)}\);<\/script>

Захватывает число после pid%3D в группе idи все после "id",[] (до следующего });</script>) в группе vinfo,

Вот демо с укороченным текстом.

0

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

Проблема захвата больше, чем вы хотите, решается с помощью групп захвата. Вы поместите часть регулярного выражения в скобки, чтобы захватить его.

Вы можете использовать preg_match_all, чтобы сделать более надежный захват регулярного выражения. Вы получите массив вещей, который содержит совпадения со строкой, которая соответствует всему шаблону, а также строку с частичным совпадением для каждой используемой группы захвата. Мы начнем с захвата частей строки, которые вы хотите. На данный момент нет групп захвата:

$text = '<a href="example.com?continue=pid%3D6057413202557366578%26oid283447094297409">Example Link</a>... Lots of other stuff in between here... 80] ,[] ,"","3245697351286309258",[] ,["812750926... and it goes on ...80] ,[] ,"","6057413202557366578",[] ,["103279554... and it continues on"';
$pattern = '/,"\\d+",\\[\\]/';
preg_match_all($pattern,
$text,
$out, PREG_PATTERN_ORDER);
echo $out[0][0]; //echo ,"3245697351286309258",[]

Теперь, чтобы получить только переменные в переменную, вы можете добавить группу захвата в ваш шаблон. Группа захвата делается путем добавления скобок:

    $text = ...
$pattern = '/,"(\\d+)",\\[\\]/'; // the \d+ match will be capture
preg_match_all($pattern,
$text,
$out, PREG_PATTERN_ORDER);
$pids = $out[1];
echo $pids[0];  // echo 3245697351286309258

Обратите внимание, что первая (и только в этом случае) группа захвата находится в $ out [1] (который является массивом). То, что мы захватили, это все цифры.

Чтобы захватить все остальное, предполагая, что все находится в квадратных скобках, вы можете сопоставить больше и захватить его Для решения вопроса мы будем использовать две группы захвата. Первый будет содержать цифры, а второй — все, что соответствует квадратным скобкам, и все, что между ними:

$text = ...;
$pattern = '/,"(\\d+)",\\[\\] ,(\\[.+?\\])/';
preg_match_all($pattern,
$text,
$out, PREG_PATTERN_ORDER);
$pids = $out[1];
$contents = $out[2];
echo $pids[0] . "=" . $contents[0] ."\n";
echo $pids[1] . "=". $contents[1];
0

По вопросам рекламы [email protected]