Привет, ребята, поэтому мне нужно извлечь первый экземпляр ISBN из JSON, используя PHP. В приведенном ниже случае мне нужно 9781451687866. Я возвращаю записи книг из библиотечного API, и из-за характера вывода JSON книга может иметь 10 или 13-значные ISBN, связанные с ней.
В любом случае мне нужен способ извлечь первый экземпляр 13-значного числа из строки в массиве и установить его равным переменной. если 13-значное число не существует, ищите 10-значное число типа ELSE «ISBN не найден».
К вашему сведению: ISBN также могут начинаться с 0, так что мне нужно это сохранить.
Есть идеи как этого добиться? Я использую цикл для вывода записей
for($i=0; $i<count($res['entries']); $i++)
...echo "<h4>Title: " . $res['entries'][$i]['bib']['title'] . "</h4>";
Я определенно не эксперт по ISBN. Так что это может не сработать в каждом сценарии. Это может быть отправной точкой для вас, потенциально.
$str1 = 'isbn: 1234567890';
$str2 = 'isbn: 123-1234567890';
$str3 = 'isbn: 1234567890123';
//matches 3 digits, then a hyphen, then 10 digits OR
//matches 10 digits in a row
$regex = '/\d{3}-\d{10}|\d{10}/';
preg_match($regex, $str1, $result1);
preg_match($regex, $str2, $result2);
preg_match($regex, $str3, $result3);
var_dump($result1);
var_dump($result2);
var_dump($result3);
К какой бы строке он ни подавался, он будет извлекать 10 цифр подряд или 13 цифр, если есть -
между.
Похоже, это решает мою проблему. Спасибо всем
for($q=0; $q<count($res['entries'][$i]['bib']['varFields']); $q++) //loop thru the varFields
{
if($res['entries'][$i]['bib']['varFields'][$q]['fieldTag'] == "i") //pull out only ISBN fieldTags with a value i
{
$subfieldText = $res['entries'][$i]['bib']['varFields'][$q]['subfields'][0]['content'];
if (preg_match_all("/\d{13}/", $subfieldText, $matches))
{
$isbnDetect = $matches[0];
echo $isbnDetect[0];
break; //if we match a 13 digit ISBN leave conditional
}
else if (preg_match_all("/\d{10}/", $subfieldText, $matches))
{
$isbnDetect = $matches[0];
echo $isbnDetect[0];
break; //else if we match a 10 digit ISBN leave conditional
}
}
else
{
$isbnDetect[0] = ""; //if no ISBN clear value
}
}