У меня серьезные проблемы с этим, и я не достаточно опытен, чтобы понять, как мне это делать.
Для начала у меня есть очень длинная строка, известная как $ 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.'",[]'
) в переменную?
Я надеюсь, что это делает то, что вы хотите:
pid%3D(?P<id>\d+).*?"(?P=id)",\[\](?P<vinfo>.*?)}\);<\/script>
Захватывает число после pid%3D
в группе id
и все после "id",[]
(до следующего });</script>
) в группе vinfo
,
Проблема захвата больше, чем вы хотите, решается с помощью групп захвата. Вы поместите часть регулярного выражения в скобки, чтобы захватить его.
Вы можете использовать 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];