търсене в стринг

r_a_s

Registered
Здравейте, имам три променливи:

$text1 = "abcdfghmn";
$text2 = "abc";
$broi = strlen($text2);

Искам да търси $text2 в $text1 от началото, тоест от първия символ и да е с дължина $broi. Брой променливата съм я сложил, защото изрично ми трябва да търси само с определен брой символи в случая са 3.
 
Този вариант съм го пробвал и не ми върши работа! Значи при мен с цикъл ми се вадят различни текстове.

Пример:

текст1 - abc

текст2 - abcd

текст3 - abcvdf

Целта ми е от тези текстове, които ми се вадят с цикъл да ми изведе само първия текст, който е abc. Иначе с този код който ти ми даде ще ми изведе и трите текста, защото и трите съдържат abc :)
 
r_a_s каза:
Този вариант съм го пробвал и не ми върши работа! Значи при мен с цикъл ми се вадят различни текстове.

Пример:

текст1 - abc

текст2 - abcd

текст3 - abcvdf

Целта ми е от тези текстове, които ми се вадят с цикъл да ми изведе само първия текст, който е abc. Иначе с този код който ти ми даде ще ми изведе и трите текста, защото и трите съдържат abc :)
Ами сложи един брояч от 0.И ако стане 1-ца break-ни цикъла и си вземаш резултата.А ако не стане значи няма намерено съвпадение.
 
http://codepad.org/YQdeWJ2Q

заповядай :) търси $text2 от началото на $text1 със същия брой символи. т.е. ако $text1 = "babcd" - няма да има съвпадение. поне така си обяснил в първия пост.
 
strpos е най-правилния начин и както каза @fbian прекъсвай цикъла като намери съвпадение.

PHP:
$needle = 'abc';
$neededValue = null;
foreach($someArray as $key => $value) {
         if ( strpos($value, $needle) ) {
                   $neededValue = $value;
                   break;
          }
}

прост пример.
 
защо не пробваш с preg_match .. нещо такова ?

Код:
if( preg_match("/abc/",$text1) )
{
  echo $text1;
}
else if( preg_match("/abc/",$text2) )
{
  echo $text2;
}
else if( preg_match("/abc/",$text3) )
{
  echo $text2;
}
else
      {
         echo $text1;
          echo "<br />";
         echo $text2;
           echo "<br />";
          echo $text2;
        }
:idea: :?:
 
r_a_s каза:
Този вариант съм го пробвал и не ми върши работа! Значи при мен с цикъл ми се вадят различни текстове.

Пример:

текст1 - abc

текст2 - abcd

текст3 - abcvdf

Целта ми е от тези текстове, които ми се вадят с цикъл да ми изведе само първия текст, който е abc. Иначе с този код който ти ми даде ще ми изведе и трите текста, защото и трите съдържат abc :)

Така като гледам ти искаш if ($text == 'abc') :D
 
joTunkiq каза:
защо не пробваш с preg_match .. нещо такова ?

Код:
if( preg_match("/abc/",$text1) )
{
  echo $text1;
}
else if( preg_match("/abc/",$text2) )
{
  echo $text2;
}
else if( preg_match("/abc/",$text3) )
{
  echo $text2;
}
else
      {
         echo $text1;
          echo "<br />";
         echo $text2;
           echo "<br />";
          echo $text2;
        }
:idea: :?:
Мисля, че по-скоро от неговото обяснение трябва да се ползва preg_match_all иначе с preg_match ще му вади само по едно съвпадение в масива на $text1! Иначе си напълно прав, че това е по-добрия варянт защото е по-разбираем и лесно се борави с него.

http://php.net/manual/en/function.preg-match.php
http://php.net/manual/en/function.preg-match-all.php
 
dakata__92 каза:
joTunkiq каза:
защо не пробваш с preg_match .. нещо такова ?

Код:
if( preg_match("/abc/",$text1) )
{
  echo $text1;
}
else if( preg_match("/abc/",$text2) )
{
  echo $text2;
}
else if( preg_match("/abc/",$text3) )
{
  echo $text2;
}
else
      {
         echo $text1;
          echo "<br />";
         echo $text2;
           echo "<br />";
          echo $text2;
        }
:idea: :?:
Мисля, че по-скоро от неговото обяснение трябва да се ползва preg_match_all иначе с preg_match ще му вади само по едно съвпадение в масива на $text1! Иначе си напълно прав, че това е по-добрия варянт защото е по-разбираем и лесно се борави с него.

http://php.net/manual/en/function.preg-match.php
http://php.net/manual/en/function.preg-match-all.php

Този вариант не е по-добър, защото е по-бавен. За нещо такова не е нужно от регулярни изрази.

@djman, ако трябва само началото да е това, което се търси, да, така както го написа ще е по-правилно, просто не обърнах внимание на искането на автора.
 
Revelation каза:
strpos е най-правилния начин и както каза @fbian прекъсвай цикъла като намери съвпадение.

PHP:
$needle = 'abc';
$neededValue = null;
foreach($someArray as $key => $value) {
         if ( strpos($value, $needle) ) {
                   $neededValue = $value;
                   break;
          }
}

прост пример.

Не виждам с какво толкова ще забави един регулярен израз нещата? Струва ми се еднакво, като време сравнено с твоя пример без да намесвам preg_match_all!
PHP:
$text = "abcdfghmn"; 
if(preg_match('/abc/',$text))
{
echo 'ima savpadenie';
}
else
{
echo 'nqma savpadenie';
}
 
Въртиш цикли, бе, човек. Как така "с какво толкова ще забави". Винаги се търси най-оптималното, възможно, решение, както и най-простото. В случая регулярните изрази са най-неоптималния и НЕпрост вариант.

Тези функции не са сложени просто да се гледат, а за да се ползват. Имат много по-голямо бързодействие, докато preg_match, едно че вика функция, второ, че оттам нататък не знаеш какви чудесии стават, за да се прочете и реално да се изпълни това чудо.
Да, във времевата константа няма да има особена разлика, но както казах, винаги търси най-оптималното решение. Ако разгледаш из интернет, ще видиш, че регулярните изрази, ако могат да се заменят с вече готови функции, то е по-добре да се ползват те.

Не искам да казвам кой, как да пише, но все пак си давам мнението, защото хората ще почнат лоша практика да ползват.
 

Горе