Эдинственое я только понять не могу. В примере из первого поста между < и a пробелов нету, но в регулярках вы их указываете. Тоесть могут быть сылкис пробелами?
Ну, вебмастера разные бывают - застраховался просто... Несколько раз встречал, когда хитрыми программами пользуются и поэтому там могут быть переводы строк.
Чтоб понять зачем это мне и как должно работать, вот кратенькое описание. Написал сервис для своих нужд, чтобы проверять как свои, так и чужие сайты на оптимизацию/SEO. Когда-то делал хороший сервис, теперь он сдох при переезде, решил с нуля опять его написать. Допустим заказчик просит посмотреть, что с его сайтом не так, я его чекаю и получаю все ссылки - битые/открытые и закрытые/левые и рекламные и т.д., затем уже лезу в шаблон и проверяю/редактирую... Когда HTML код длиною в километр и написан как попало, то гораздо удобнее видеть всё наглядно, где и что сломано на сайте
П.С. Спасибо за участие.
П.П.С. Эх, похоже, что регулярка не работает вообще так, пробовал и 2 и 3 слеша.
Первые две части отдельно затем проверяю и подсвечиваю. Если посмотрите кусок кода, который привел в пример, то там 2 ссылки идут как одна, я их уже сделал недавно как 2 (добавил к первому сообщению), но, возможно, есть какое-то более "чистое" решение.
Спасибо за ответ. К сожалению, ваш пример мне не подойдет и ссылка на учебник мне не актуальна; php за год я достаточно хорошо освоил, но вот в конкретном своём вопросе запутался. Хочу разбить ссылки из текста на 3 части, чтоб разобрать левую (проверить ссылки на индексируемсть) и центральную часть, чтоб подсветить ключ. Дело в том, что в JS ссылки пишутся так: < \/ a >, поэтому их вытащить из HTML нельзя вашим способом, а мои способы не работают, либо корявым методом, который я в конце добавил.
Как видно из кода, здесь 2 ссылки. Вырезал разными вариантами - всё равно ссылки 2 в тексте, а должно быть по одной, т.е. делиться по: < / a> или по < \/ a>. Пробовал такие регулярки:
вместо 10 пунктов селекта выдает 10 умноженное на 3 селектов
Видимо, это потому, что вы используете один цикл (foreach) внутри другого (while) - подумайте над логикой...
Если требуется именно так (?) логику строить, тогда внутри цикла foreach нужно еще раз проверить: существует ли ключ массива, либо такое значение массива, если да, то заново не добавлять.
Поскольку код не очень читабельный, то сами... вынесите второй цикл "foreach($numer as $linems)" из цикла "while@? полагаю, он там вообще не к месту, тогда 1 раз будет распечатка ;)
Uchkuma, только что понял... ох, капец, какой я косячник
Сейчас поставил проверку без инклюда, чтоб еще раз убедиться в вашей настойчивости... М... сколько не живи, а всё равно всех истин не познаешь... Скорее всего дело вот в чем: наклепал огромнейшую функцию и вначале определил список глобальных переменных, видимо, ошибка потому и выскакивала, что некоторые переменные уже были глобальными, а я их инклюдил еще и как локальные (массивы-настройки), только что заметил это в своей "портянке", а мне казалось, что ошибка именно на проверку (иссет и из_аррай), а не на инклюд вылетала, таких ошибок около сотни.
П.С. строку уже много раз копировал, вот весь код строки (менял много раз с разными комбинациями):
if (!isset($arr) && !is_array($arr)) @include $file;
Сейчас закомментировал инклюд - ошибка исчезла на иссет, но еще помусолю, чтоб убедиться самому наверняка.
Спасибо огромное, всё-таки докопались до истины, а я уже забить хотел... Ну, уже везде каунты прописал с собачкой вместо иссета, эх, обратно править буду. Еще раз спасибо.
что просто иссет оставить, что просто из_аррай - всё равно ошибку "андефайн" выкидывает, типа, элемент такой не найден Как поставить или снять ошибки - тоже написал, если у вас нет ошибок на экране - это значит, что они выключены, а не то, что ваш код идеален, включите и гляньте, убедитесь сами ;)
сделайте проверку на иссет на существование первого элемента массива.Или на размер массива, если равен нулю,то ..
Ну так об этом я и написал - ошибку выдает на иссет, а на калькуляцию с собачкой - работает
Если б знать какой именно элемент массива нужен - другое дело, его можно как переменную иссетом проверить, но когда массивов много и какой у них может быть первый элемент - не известно, то получить первый элемент тоже нельзя (в ассоциативном массиве) - опять ошибка, если элемента нет - уже проверил и не раз. Если нет массива, то и получить первый элемент его нельзя - логично... ну, с собачкой только если... но гораздо проще - это произвести его подсчет, хотя, для больших массивов это, скорее всего, будет накладней.
Это сработало, а внутри функции выдало ошибку, при чем разные варианты перепробовал - ошибка при всех вариантах, поэтому пока только подсчет массива использую - 0, false, число; если число, то массив загружен, иначе - либо пустой, либо его нет вовсе, что мне и нужно было проверить
Привет, форумчане. Появилась маленькая проблемка в определинии наличия массива, решать ее корявым способом - отключением сообщений об ошибках (собака или настройка) и подобными способами - не профессионально, вроде Хотелось бы использовать чистое решение и правильный код.
Побегал по пхп-сайту - не нашел примеров, но, может, кто сталкивался и знает как определить наличие массива в данный момент? суть такая:
Используя различные условия подгружаю инклюдами различные настройки (массивы), которые нужно проверить на наличие: какой массив в данный момент загружен или отсутствует. Самый простой способ - создать сначала все пустые массивы перед их подгрузкой и проверять пустые они или нет.
Функции isset() и empty() работают только с переменными (не массивами), функция is_array() проверяет только тип загруженной переменной - массив она или нет, пустая функция if ($arr) {} в случае массива (а не переменной) выдает сообщение об ошибке:
Цитата:
Notice: Undefined variable: $arr in /home/xxx/data/www/site.ru/engin e/modules/islemap/blocks.php on line xxx
вариант подсчета массива, типа:
if (count($arr)) {}
и подобные выдают ошибку (при включенных ошибках).
Пробовал различные варианты, но все комбинации функций всё равно выводят ошибку "андефайн". Неужели обязательно нужно сначала создать пустые массивы, загрузить их из кеша и проверить их на "нулл" после загрузки?
Как вариант единственной проверки, которая пришла на ум, - сначала взять первый ключ массива функцией
$key = array_shift($arr);
, если он взят и переменная получена
if (isset($key)) {
echo 'Массив загружен';
} else echo 'Массив не существует';
, то проверяем этот ключ далее на "пустоту" (null). Такой метод кажется весьма громоздким для такой простой задачи Может, есть вариант попроще?
П.С. Для включение ошибок использовал (и без "собак" перед переменными):
error_reporting(E_ALL);
ini_set('display_errors',TRUE);
ini_set('display_startup_errors',TRUE);
set_error_handler('my_error_handler',E_ALL); (Добавление)
О, капец, не догадался, блин. Всё, сделал так:
if (isset($ism) && is_array($ism)) echo 1; else echo 2;
ошибка исчезла
А вот так ранее делал и ошибка была:
if (is_array(isset($ism))) echo 1; else echo 2;
Топик можно закрыть или удалить. (Добавление)
М... странно, все равно ошибки лезут. Эх, вдруг кому из еовичков понадобится Лучший вариант, который смог методом научного тыка найти, вот...
К сожалению, подзабыл как делается "опережение" в регулярках, поэтому наваял простенький скриптик на скорую руку, должен работать, но не проверял.
Без "опережения" скрипт будет кидать в массив вместо 6 ответов только 5, но 6-й найти не сложно, раз есть уже 5, то из исходного блока достаточно удалить вопрос и 5 имеющихся ответов, таким образом исключениями получим и 6-й... Может кто сейчас подправит регулярку, ну, или сами по указанному алгоритму, раз с php знакомы А у меня времени нет копать всё это, своими сайтами занимаюсь. Надеюсь, помог.
Ну всё, вроде ничего не упустил. На выходе получим каждый ответ отдельно, включая правильный (он тоже отдельно) за каждым вопросом (вопросы тоже разбиты), ну а далее заносите массив в БД или сохраняйте на винчестер и обрабатывайте как вам надо ;) (Добавление)
Что-то сразу не вдумался
Если все вопросы изначально в Ворде, то никчему ничего приводить не нужно - надо просто сохранить как XML или как Excel-файл, тогда скрипт вообще в несколько строк выйдет и импортировать в БД можно сразу без регулярок и обраток различных.
Почти правильно. Обычным файл_гкт_контент можно всё вытащить без проблем, далее сохранить всё в многомерный массив (обратно в текстовый файл, можно с разбивкой, если памяти не очень много), а его уже перекинуть в БД. Много раз такое делал - пустяковая вещь, только единственно в справочники постоянно лезу, если нужно с массивами работать - тягомутно для меня.
Для начала нужно вытащить каждый блок (вопрос-ответы) через preg_match_all, а потом все блоки разбить на подмассивы. В общем-то ничего сверхъестественного, но нужны конкретные метки на которые можно ориентироваться: например, все вопросы должны строго на конце иметь символ "?", либо иметь вначале "\n\n", чтобы выделить цельный блок, а дальше дело техники.
13n1n пишет:
хочется минимизировать ручную работу.
Можно автоматизировать абсолютно всё, не пойму только как разделить... Судя по всему, это строго идет:
"5.9 Текст вопроса ..."
Если да, то можно блоки разбить по шаблону "цифра-точка-цифра". Нужно от вас уточнение.
Ага, сейчас так сделать попробовал, в итоге получаю картинку (она грузится, пока аякс работает, типа "подождите, загружаю"). Всё, понял, поставлю паузу на пару сек., а то "нулл" получаю потому что аякс не успевает подгрузить содержимое. Странно, ведь скрипты последовательно, а не одновременно запускаются. Причина ясна стала.
В итоге получаю алертом "null", хотя вижу на странице отображение "22".
Если же аяксом не меняю содержимое, т.е. оставляю по умолчанию "11", то оно выдается "11", если меняю (innerHTML="22"), то вместо "22" алерт дает "нулл". Не пойму, где косяк может быть, наверно, только статические контейнеры (котторые аяксом не меняются) показываются алертом - странно.
Думается, что пока обновляется содержимое аяксом в это время и появляется "нулл".
duk, спасибо, работает. Эх, но появилась странная загвоздка: если статический тег беру - получаю содержимое, если же меняю через аякс (innerHTML), то получаю почему-то "нулл", хотя содержимое есть и обрабатывается раньше, даже спициально текст добавил для статики. А нельзя ли как-то динамически получить?