PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (8): « 1 2 3 [4] 5 6 7 8 »

> Найдено сообщений: 111
isle Отправлено: 19 Декабря, 2010 - 00:37:52 • Тема: Вырезать ссылки • Форум: Регулярные выражения

Ответов: 16
Просмотров: 973
OrmaJever пишет:
Эдинственое я только понять не могу. В примере из первого поста между < и a пробелов нету, но в регулярках вы их указываете. Тоесть могут быть сылкис пробелами?


Ну, вебмастера разные бывают - застраховался просто... Несколько раз встречал, когда хитрыми программами пользуются и поэтому там могут быть переводы строк.

Чтоб понять зачем это мне и как должно работать, вот кратенькое описание. Написал сервис для своих нужд, чтобы проверять как свои, так и чужие сайты на оптимизацию/SEO. Когда-то делал хороший сервис, теперь он сдох при переезде, решил с нуля опять его написать. Допустим заказчик просит посмотреть, что с его сайтом не так, я его чекаю и получаю все ссылки - битые/открытые и закрытые/левые и рекламные и т.д., затем уже лезу в шаблон и проверяю/редактирую... Когда HTML код длиною в километр и написан как попало, то гораздо удобнее видеть всё наглядно, где и что сломано на сайте Улыбка

П.С. Спасибо за участие.
П.П.С. Эх, похоже, что регулярка не работает вообще так, пробовал и 2 и 3 слеша.
isle Отправлено: 18 Декабря, 2010 - 23:29:18 • Тема: Вырезать ссылки • Форум: Регулярные выражения

Ответов: 16
Просмотров: 973
В регулярках же указано Улыбка

Нужно так: (< a >)(text)(< /a >)

Первые две части отдельно затем проверяю и подсвечиваю. Если посмотрите кусок кода, который привел в пример, то там 2 ссылки идут как одна, я их уже сделал недавно как 2 (добавил к первому сообщению), но, возможно, есть какое-то более "чистое" решение.
isle Отправлено: 18 Декабря, 2010 - 18:32:31 • Тема: Вырезать ссылки • Форум: Регулярные выражения

Ответов: 16
Просмотров: 973
Спасибо за ответ. К сожалению, ваш пример мне не подойдет и ссылка на учебник мне не актуальна; php за год я достаточно хорошо освоил, но вот в конкретном своём вопросе запутался. Хочу разбить ссылки из текста на 3 части, чтоб разобрать левую (проверить ссылки на индексируемсть) и центральную часть, чтоб подсветить ключ. Дело в том, что в JS ссылки пишутся так: < \/ a >, поэтому их вытащить из HTML нельзя вашим способом, а мои способы не работают, либо корявым методом, который я в конце добавил.
isle Отправлено: 18 Декабря, 2010 - 11:32:47 • Тема: Вырезать ссылки • Форум: Регулярные выражения

Ответов: 16
Просмотров: 973
Привет, форумчане. Никак не выходит вырезать ссылки из текста, кто знает, поскажите, пожалуйста, в чём ошибка.

Вот пример текста:

CODE (html):
скопировать код в буфер обмена
  1. <a rel='nofollow' href='http://click.hotlog.ru/?564274' target='_top'><img "+" src='http://hit28.hotlog.ru/cgi-bin/hotlog/count?"+hotlog_r+"&' border=0 width=88 height=31 alt=HotLog><\/a>")</script>
  2.                         <noscript><a rel="nofollow" href="http://click.hotlog.ru/?564274" target="_top"><img src="http://hit28.hotlog.ru/cgi-bin/hotlog/count?s=564274&im=134" border="0" width="88" height="31" alt="HotLog"></a>


Как видно из кода, здесь 2 ссылки. Вырезал разными вариантами - всё равно ссылки 2 в тексте, а должно быть по одной, т.е. делиться по: < / a> или по < \/ a>. Пробовал такие регулярки:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $pattern = '|(<\s*a\s+[^>]*>)(.*?)(<\s*[\]?/[\s]*a\s*>)|smi';


CODE (htmlphp):
скопировать код в буфер обмена
  1. $pattern = '|(<\s*a\s+[^>]*>)(.*?)(<\s*[\\]?/[\s]*a\s*>)|smi';


CODE (htmlphp):
скопировать код в буфер обмена
  1. $pattern = '|(<\s*a\s+[^>]*>)(.*?)(<\s*[\\]?/[\s]*a\s*>)(?:<a\s+[^>]*>)?|smi';


и прочие аналоги, эх, никак не разбиваются...
(Добавление)
Опаньки! Сам что-то придумал Улыбка

Вот так заработала всё-таки, но мне такое решение кажется корявым:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $pattern = '|(<\s*a\s+[^>]*>)(.*?)([\<\s\/]*/[\s]*a\s*>)(?:<a\s+[^>]*>)?|smi';
isle Отправлено: 24 Августа, 2010 - 12:40:38 • Тема: Цикл foreach • Форум: Программирование на PHP

Ответов: 12
Просмотров: 872
srazil пишет:
вместо 10 пунктов селекта выдает 10 умноженное на 3 селектов


Видимо, это потому, что вы используете один цикл (foreach) внутри другого (while) - подумайте над логикой...

Если требуется именно так (?) логику строить, тогда внутри цикла foreach нужно еще раз проверить: существует ли ключ массива, либо такое значение массива, если да, то заново не добавлять.

Поскольку код не очень читабельный, то сами... вынесите второй цикл "foreach($numer as $linems)" из цикла "while@? полагаю, он там вообще не к месту, тогда 1 раз будет распечатка ;)
isle Отправлено: 15 Августа, 2010 - 12:06:21 • Тема: Загружен ли массив? • Форум: Программирование на PHP

Ответов: 10
Просмотров: 1472
Uchkuma, только что понял... ох, капец, какой я косячник Ха-ха

Сейчас поставил проверку без инклюда, чтоб еще раз убедиться в вашей настойчивости... М... сколько не живи, а всё равно всех истин не познаешь... Радость Скорее всего дело вот в чем: наклепал огромнейшую функцию и вначале определил список глобальных переменных, видимо, ошибка потому и выскакивала, что некоторые переменные уже были глобальными, а я их инклюдил еще и как локальные (массивы-настройки), только что заметил это в своей "портянке", а мне казалось, что ошибка именно на проверку (иссет и из_аррай), а не на инклюд вылетала, таких ошибок около сотни.

П.С. строку уже много раз копировал, вот весь код строки (менял много раз с разными комбинациями):

CODE (htmlphp):
скопировать код в буфер обмена
  1. if (!isset($arr) && !is_array($arr)) @include $file;


Сейчас закомментировал инклюд - ошибка исчезла на иссет, но еще помусолю, чтоб убедиться самому наверняка.

Спасибо огромное, всё-таки докопались до истины, а я уже забить хотел... Ну, уже везде каунты прописал с собачкой вместо иссета, эх, обратно править буду. Еще раз спасибо.
isle Отправлено: 15 Августа, 2010 - 11:25:40 • Тема: Загружен ли массив? • Форум: Программирование на PHP

Ответов: 10
Просмотров: 1472
Uchkuma пишет:
Не верю. Текст ошибки в студию! И код строки, в которой происходит ошибка.


Цитату в первом сообщении можете глянуть Улыбка

Проверку как делал - тоже написал, раз лень смотреть сначала, процитирую еще раз:

Цитата:
Notice: Undefined variable: $arr in /home/xxx/data/www/site.ru/engin e/modules/islemap/blocks.php on line xxx


Проверку делал разными вариантами, например, так (тоже выше привел несколько примеров, вываливающих мне ошибки):

CODE (htmlphp):
скопировать код в буфер обмена
  1. if (isset($arr) && is_array($arr)) {
  2.  ...
  3. }


что просто иссет оставить, что просто из_аррай - всё равно ошибку "андефайн" выкидывает, типа, элемент такой не найден Улыбка Как поставить или снять ошибки - тоже написал, если у вас нет ошибок на экране - это значит, что они выключены, а не то, что ваш код идеален, включите и гляньте, убедитесь сами ;)
isle Отправлено: 15 Августа, 2010 - 09:59:12 • Тема: Загружен ли массив? • Форум: Программирование на PHP

Ответов: 10
Просмотров: 1472
SAD пишет:
сделайте проверку на иссет на существование первого элемента массива.Или на размер массива, если равен нулю,то ..


Ну так об этом я и написал - ошибку выдает на иссет, а на калькуляцию с собачкой - работает Улыбка

Если б знать какой именно элемент массива нужен - другое дело, его можно как переменную иссетом проверить, но когда массивов много и какой у них может быть первый элемент - не известно, то получить первый элемент тоже нельзя (в ассоциативном массиве) - опять ошибка, если элемента нет - уже проверил и не раз. Если нет массива, то и получить первый элемент его нельзя - логично... ну, с собачкой только если... но гораздо проще - это произвести его подсчет, хотя, для больших массивов это, скорее всего, будет накладней.
isle Отправлено: 15 Августа, 2010 - 09:35:50 • Тема: Загружен ли массив? • Форум: Программирование на PHP

Ответов: 10
Просмотров: 1472
isset() и empty() работают с переменными, а не массивами, проверил у себя не раз - ошибку выдает, зачем мне вас обманывать? Ха-ха

Единственный вариант проверки наличия массива нашел для себя - это его подсчет с отключением ошибки "собачкой".

Уточню на всякий случай.

В глобальной видимости

CODE (htmlphp):
скопировать код в буфер обмена
  1. if(isset($arr) && is_array($arr)) echo 'Массив есть'; else echo 'Массива нет';


Это сработало, а внутри функции выдало ошибку, при чем разные варианты перепробовал - ошибка при всех вариантах, поэтому пока только подсчет массива использую - 0, false, число; если число, то массив загружен, иначе - либо пустой, либо его нет вовсе, что мне и нужно было проверить Улыбка
isle Отправлено: 15 Августа, 2010 - 06:58:33 • Тема: Загружен ли массив? • Форум: Программирование на PHP

Ответов: 10
Просмотров: 1472
Привет, форумчане. Появилась маленькая проблемка в определинии наличия массива, решать ее корявым способом - отключением сообщений об ошибках (собака или настройка) и подобными способами - не профессионально, вроде Улыбка Хотелось бы использовать чистое решение и правильный код.

Побегал по пхп-сайту - не нашел примеров, но, может, кто сталкивался и знает как определить наличие массива в данный момент? суть такая:

Используя различные условия подгружаю инклюдами различные настройки (массивы), которые нужно проверить на наличие: какой массив в данный момент загружен или отсутствует. Самый простой способ - создать сначала все пустые массивы перед их подгрузкой и проверять пустые они или нет.

Функции 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;

Топик можно закрыть или удалить.
(Добавление)
М... странно, все равно ошибки лезут. Эх, вдруг кому из еовичков понадобится Улыбка Лучший вариант, который смог методом научного тыка найти, вот...

Вариант не прокатывает:

if (!@is_array($arr) && $arr!=null) {}

А вот так всё ок:

if (!@count($arr)) {}

Ну всё, удачи всем, пока.
isle Отправлено: 26 Июля, 2010 - 14:29:06 • Тема: Чтение из файла. разбиение на куски и запись в переменные • Форум: Программирование на PHP

Ответов: 12
Просмотров: 1292
К сожалению, подзабыл как делается "опережение" в регулярках, поэтому наваял простенький скриптик на скорую руку, должен работать, но не проверял.

Без "опережения" скрипт будет кидать в массив вместо 6 ответов только 5, но 6-й найти не сложно, раз есть уже 5, то из исходного блока достаточно удалить вопрос и 5 имеющихся ответов, таким образом исключениями получим и 6-й... Может кто сейчас подправит регулярку, ну, или сами по указанному алгоритму, раз с php знакомыУлыбка А у меня времени нет копать всё это, своими сайтами занимаюсь. Надеюсь, помог.

Если это точная копия, то регулярка будет такой:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $file = 'txt.txt';
  2. $data = file_get_contents($file);
  3. preg_match_all('|(\s+\d+\.\d+\s+.*?)\s+\d+\.\d+\s+|smi',$data,$out);
  4. $c = count($out[1]);
  5. #for($i=0;$i<$c;$i++) echo $out[1][$i];
  6.  
  7. ...
  8.  
  9. for($i=0;$i<$c;$i++) {
  10.  preg_match('|(\s+\d+\.\d+\s+.*?)\s+\d+\.\s+|smi',$out[1][$i],$q);
  11.  $question = $q?$q:false;
  12.  if ($question) {
  13.         $my[$i]['question'] = $question;
  14.         preg_match_all('|(\s+\d+\.\s+.*?)\s+\d+\.\s+|smi',$out[1][$i],$a);
  15.         $answers = $a[1];
  16.         foreach($answers as $ans) {
  17.           $j = 0;
  18.           if (preg_match('|\d+\.\*\s+|smi',$ans)) $my[$i]['answer_good'][$j] = $ans;
  19.           else $my[$i]['answer'][$j] = $ans;
  20.           $j++;
  21.         }
  22.  }
  23. }
  24. #echo '<br /><pre>'; print_r($my); echo '</pre>';


Ну всё, вроде ничего не упустил. На выходе получим каждый ответ отдельно, включая правильный (он тоже отдельно) за каждым вопросом (вопросы тоже разбиты), ну а далее заносите массив в БД или сохраняйте на винчестер и обрабатывайте как вам надо ;)
(Добавление)
Что-то сразу не вдумался Ха-ха

Если все вопросы изначально в Ворде, то никчему ничего приводить не нужно - надо просто сохранить как XML или как Excel-файл, тогда скрипт вообще в несколько строк выйдет Радость и импортировать в БД можно сразу без регулярок и обраток различных.
isle Отправлено: 26 Июля, 2010 - 12:21:44 • Тема: Чтение из файла. разбиение на куски и запись в переменные • Форум: Программирование на PHP

Ответов: 12
Просмотров: 1292
13n1n пишет:
Может быть реализовать механизм такой


Почти правильно. Обычным файл_гкт_контент можно всё вытащить без проблем, далее сохранить всё в многомерный массив (обратно в текстовый файл, можно с разбивкой, если памяти не очень много), а его уже перекинуть в БД. Много раз такое делал - пустяковая вещь, только единственно в справочники постоянно лезу, если нужно с массивами работать - тягомутно для меня.

Для начала нужно вытащить каждый блок (вопрос-ответы) через preg_match_all, а потом все блоки разбить на подмассивы. В общем-то ничего сверхъестественного, но нужны конкретные метки на которые можно ориентироваться: например, все вопросы должны строго на конце иметь символ "?", либо иметь вначале "\n\n", чтобы выделить цельный блок, а дальше дело техники.

13n1n пишет:
хочется минимизировать ручную работу.


Можно автоматизировать абсолютно всё, не пойму только как разделить... Судя по всему, это строго идет:

"5.9 Текст вопроса ..."

Если да, то можно блоки разбить по шаблону "цифра-точка-цифра". Нужно от вас уточнение.
isle Отправлено: 26 Июля, 2010 - 12:08:10 • Тема: Содержимое контейнера (объекта) • Форум: JavaScript & VBScript

Ответов: 7
Просмотров: 3181
Ага, сейчас так сделать попробовал, в итоге получаю картинку (она грузится, пока аякс работает, типа "подождите, загружаю"). Всё, понял, поставлю паузу на пару сек., а то "нулл" получаю потому что аякс не успевает подгрузить содержимое. Странно, ведь скрипты последовательно, а не одновременно запускаются. Причина ясна стала.

Спасибо огромное.
isle Отправлено: 26 Июля, 2010 - 11:47:34 • Тема: Содержимое контейнера (объекта) • Форум: JavaScript & VBScript

Ответов: 7
Просмотров: 3181
duk пишет:
термин "динамически" не очень понятен...


То есть, по умолчанию поставил содержимое "спана" от балды - "11", потом аяксом меняю:

document.getElementById("spanid").innerHTML = "22";

В итоге получаю алертом "null", хотя вижу на странице отображение "22".

Если же аяксом не меняю содержимое, т.е. оставляю по умолчанию "11", то оно выдается "11", если меняю (innerHTML="22"), то вместо "22" алерт дает "нулл". Не пойму, где косяк может быть, наверно, только статические контейнеры (котторые аяксом не меняются) показываются алертом - странно.

Думается, что пока обновляется содержимое аяксом в это время и появляется "нулл".
isle Отправлено: 26 Июля, 2010 - 11:25:55 • Тема: Содержимое контейнера (объекта) • Форум: JavaScript & VBScript

Ответов: 7
Просмотров: 3181
duk, спасибо, работает. Эх, но появилась странная загвоздка: если статический тег беру - получаю содержимое, если же меняю через аякс (innerHTML), то получаю почему-то "нулл", хотя содержимое есть и обрабатывается раньше, даже спициально текст добавил для статики. А нельзя ли как-то динамически получить?

Страниц (8): « 1 2 3 [4] 5 6 7 8 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB