Используя ответ Prestaul , я добавил несколько проверок, и я предпочитаю использовать способ jQuery.
function imgError(image, type) {
if (typeof jQuery !== 'undefined') {
var imgWidth=$(image).attr("width");
var imgHeight=$(image).attr("height");
// Type 1 puts a placeholder image
// Type 2 hides img tag
if (type == 1) {
if (typeof imgWidth !== 'undefined' && typeof imgHeight !== 'undefined') {
$(image).attr("src", "http://lorempixel.com/" + imgWidth + "/" + imgHeight + "/");
} else {
$(image).attr("src", "http://lorempixel.com/200/200/");
}
} else if (type == 2) {
$(image).hide();
}
}
return true;
}
Как описано в в этом ответе , я предлагаю разрешить WordPress выполнять вашу работу с помощью функции get_shortcode_regex()
.
$pattern = get_shortcode_regex();
preg_match_all("/$pattern/",$wp_content,$matches);
Это даст вам массив с которыми легко работать, и показывает различные короткие коды и аффилированные атрибуты в вашем контенте. Это не самый очевидный формат массива, поэтому распечатайте его и посмотрите, чтобы вы знали, как управлять данными, которые вам нужны.
Вы можете использовать следующий RegEx для соответствия переменным:
$regex = '/(\w+)\s*=\s*"(.*?)"/';
Я бы предложил сначала совместить короткий код sublimevideo и получить его в строку со следующим RegEx:
$pattern = '/\[sublimevideo(.*?)\]/';
Чтобы получить правильные ключи массива, я использовал этот код:
// $string is string content you specified
preg_match_all($regex, $string, $matches);
$sublimevideo = array();
for ($i = 0; $i < count($matches[1]); $i++)
$sublimevideo[$matches[1][$i]] = $matches[2][$i];
Это возвращает следующий массив: (тот, который вы запросили)
Array
(
[class] => sublime
[poster] => http://video.host.com/_previews/600x450/sbx-60025-00-da-ANA.png
[src1] => http://video.host.com/_video/H.264/LO/sbx-60025-00-da-ANA.m4v
[src2] => (hd)http://video.host.com/_video/H.264/HI/sbx-60025-00-da-ANA.m4v
[width] => 560
[height] => 315
)
Это даст вам то, что вы хотите.
$data = 'Irrelevant tekst... [sublimevideo class="sublime" poster="http://video.host.com/_previews/600x450/sbx-60025-00-da-ANA.png" src1="http://video.host.com/_video/H.264/LO/sbx-60025-00-da-ANA.m4v" src2="(hd)http://video.host.com/_video/H.264/HI/sbx-60025-00-da-ANA.m4v" width="560" height="315"] ..more irrelevant text.';
$dat = array();
preg_match("/\[sublimevideo (.+?)\]/", $data, $dat);
$dat = array_pop($dat);
$dat= explode(" ", $dat);
$params = array();
foreach ($dat as $d){
list($opt, $val) = explode("=", $d);
$params[$opt] = trim($val, '"');
}
print_r($params);
В ожидании следующей задачи вы столкнетесь с обработкой коротких кодов, вы можете использовать preg_replace_callback для замены данных коротких тегов с помощью результирующей разметки.
$data = 'Irrelevant tekst... [sublimevideo class="sublime" poster="http://video.host.com/_previews/600x450/sbx-60025-00-da-ANA.png" src1="http://video.host.com/_video/H.264/LO/sbx-60025-00-da-ANA.m4v" src2="(hd)http://video.host.com/_video/H.264/HI/sbx-60025-00-da-ANA.m4v" width="560" height="315"] ..more irrelevant text.';
function processShortCode($matches){
// parse out the arguments
$dat= explode(" ", $matches[2]);
$params = array();
foreach ($dat as $d){
list($opt, $val) = explode("=", $d);
$params[$opt] = trim($val, '"');
}
switch($matches[1]){
case "sublimevideo":
// here is where you would want to return the resultant markup from the shorttag call.
return print_r($params, true);
}
}
$data = preg_replace_callback("/\[(\w+) (.+?)]/", "processShortCode", $data);
echo $data;
.+?
, иначе он будет соответствовать до последней скобки ]
(на входе) :)
– HamZa
12 August 2013 в 22:03