Автор Тема: Функция за откриване последното място на стринг в друг стринг.  (Прочетена 1201 пъти)

kennedy

  • Напреднали
  • *****
  • Публикации: 2151
  • Николай Колев
    • Профил
покрай предната тема реших да доработя скрипта и се натъкнах на следния проблем.
искам да определя къде е последната таблица и да я елиминирам преди да мине екстрактора на адреси.
имам една функция която върши уж тази работа
Цитат
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>" ... нямам идея защо ...
та има ли някой функция която връща последната позиция на стринг в друг, но да работи с кирилица и символи като <>
Активен

"за всичко иде час" Еклесиаст 3:1
всеки пост - отговор на въпрос
-----------------
24.12.2003 "MS Free"

Naka

  • Напреднали
  • *****
  • Публикации: 3402
    • Профил
Ами ако входящият стринг е в 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 символи) и затова офсета след това го нормализирам, да показва коректно отместването в символи.
« Последна редакция: Aug 24, 2011, 23:04 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.