Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: kennedy в Aug 24, 2011, 20:17



Титла: Функция за откриване последното място на стринг в друг стринг.
Публикувано от: kennedy в Aug 24, 2011, 20:17
покрай предната тема реших да доработя скрипта и се натъкнах на следния проблем.
искам да определя къде е последната таблица и да я елиминирам преди да мине екстрактора на адреси.
имам една функция която върши уж тази работа
Цитат
function strrpos_new($haystack, $needle, $offset = 0)
{
/* check for a negative offset and assertain where
searching should stop */
if ($offset < 0) {
$stop = strlen($haystack) + $offset - 1;
$offset = 0;
} else {
$stop = strlen($haystack) -1;
}

/* set initial return value to false, just incase the string
is never found */
$old_pos = false;

/* use strpos() until no match is found */
while (($pos = strpos($haystack, $needle, $offset)) !== false
&& $pos <= $stop) {
$old_pos = $pos;
$offset = $old_pos + strlen($needle);
}

/* return the old position */
return $old_pos;
}

справя се чудесно ако търся "table" но не може да търси нищо на кирилица нито да намери "<table>" ... нямам идея защо ...
та има ли някой функция която връща последната позиция на стринг в друг, но да работи с кирилица и символи като <>


Титла: Re: Функция за откриване последното място на стринг в друг стринг.
Публикувано от: Naka в Aug 24, 2011, 22:19
Ами ако входящият стринг е в utf8 няма да работи - независмо дали подаваш кирилица или китайски.
Повечето стрингови функции не работят кореткно при utf8 стрингове. Затова си имат аналози с mb_xxxxxx отпред. В случая функията успява да намери правилно  "table" даже и в utf8 стринг, защото ascii символите имат пак същата кодировка и в utf8.



http://www.php.net/manual/en/function.mb-strpos.php
и strlen() също няма да работи правилно.
http://php.net/manual/en/function.mb-strlen.php

Частен случай е обаче ако подаваш кирилица в cp1251. Тогава функцията ще търси правилно и на кирилица, но задължително преди да я извикаш трябва да се зададе locale в 1251: http://www.php.net/manual/en/function.setlocale.php

Ако си пренапишеш функцията с mb_ аналозите, locale няма да ти трябва и ще работи всякак.

------------------------------------------
това упражнение го правя с preg_match_all() и флаг PREG_OFFSET_CAPTURE
обаче и там има грешка/подробност, че preg_match_all връща отместването в байтове (а не в utf8 символи) и затова офсета след това го нормализирам, да показва коректно отместването в символи.