оптимизировать скорость регулярного выражения при запросе curl с помощью php при размещении в многомерном массиве - PullRequest
0 голосов
/ 11 октября 2011

код хорошо прокомментирован

мне нужно оптимизировать его, объединив операции, которые я выполняю для каждого значения

<?php

устанавливает URL для запуска с

$pagenumber = 20;

устанавливает окончание URL в

while ($pagenumber <= 25) {

создать новый ресурс cURL

$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.bkesher.com/frum_detail.php?num=$pagenumber");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

// grab URL and pass it to the browser
$content = curl_exec($ch);

// close cURL resource, and free up system resources
curl_close($ch);

// очищает возврат и сохраняет только таблицу для удаления со страницы

$newlines = array("\t","\n","\r","&nbsp;","\0","\x0B");
$newcontent = str_replace($newlines, '', $content);

$start = strpos($newcontent,'>Details<');
$end = strpos($newcontent,'</table>',$start);
$table1 = substr($newcontent,$start,$end-$start);
// $table1 = strip_tags($table1);

// проверяет, что таблица заполнена

if (!empty($table1)) {

// получает имя

$start = strpos($table1,'<td');
$end = strpos($table1,'<br />',$start);
$fnames = substr($table1,$start,$end-$start);
$fnames = strip_tags($fnames);
$fnames = preg_replace('/\s\s+/', '', $fnames);

// получает семью

$start = strpos($table1,'<br />');
$end = strpos($table1,'</td>',$start);
$lnames = substr($table1,$start,$end-$start);
$lnames = strip_tags($lnames);
$lnames = preg_replace('/\s\s+/', '', $lnames);

// получает телефон

$start = strpos($table1,'Phone:');
$end = strpos($table1,'</td>              </tr>              <tr>',$start);
$phone = substr($table1,$start,$end-$start);
$phone = strip_tags($phone);
$phone = str_replace("Phone:", "" ,$phone);
$phone = preg_replace('/\s\s+/', '', $phone);

// получает адрес

$start = strpos($table1,'Address:');
$end = strpos($table1,'</td>              </tr>              <tr>',$start);
$ad = substr($table1,$start,$end-$start);
$ad = strip_tags($ad);
$ad = str_replace("Address:", "" ,$ad);
$ad = preg_replace('/\s\s+/', '', $ad);

// получает метку

$start = strpos($table1,'Apt:');
$end = strpos($table1,'</td>              </tr>              <tr>',$start);
$apt = substr($table1,$start,$end-$start);
$apt = strip_tags($apt);
$apt = str_replace("Apt:", "" ,$apt);
$apt = preg_replace('/\s\s+/', '', $apt);

// получает страну

$start = strpos($table1,'Country:');
$end = strpos($table1,'</td>              </tr>              <tr>',$start);
$country = substr($table1,$start,$end-$start);
$country = strip_tags($country);
$country = str_replace("Country:", "" ,$country);
$country = preg_replace('/\s\s+/', '', $country);

// получает город

$start = strpos($table1,'City:<br />                 State/Province:');
$end = strpos($table1,'</td>              </tr>              <tr>',$start);
$city = substr($table1,$start,$end-$start);
$city = strip_tags($city);
$city = str_replace("City:                 State/Province:", "" ,$city);
$city = preg_replace('/\s\s+/', '', $city);

// получает почтовый индекс

$start = strpos($table1,'Zip:');
$end = strpos($table1,'</td>              </tr>              <tr>',$start);
$zip = substr($table1,$start,$end-$start);
$zip = strip_tags($zip);
$zip = str_replace("Zip:", "" ,$zip);
$zip = preg_replace('/\s\s+/', '', $zip);

// получает письмо

$start = strpos($table1,'email:');
$end = strpos($table1,'</td>              </tr>',$start);
$email = substr($table1,$start,$end-$start);
$email = strip_tags($email);
$email = str_replace("email:", "" ,$email);
$email = preg_replace('/\s\s+/', '', $email);

// помещает отдельные результаты в переменную строки

$cleancontent = array($pagenumber, $fnames, $lnames, $phone, $ad, $apt, $country, $city, $zip, $email);

// помещает результаты строки в основную переменную

$stack[] = $cleancontent;

// переходит на следующую страницу

$pagenumber++;
}

// переход на следующую страницу, если таблица пуста

else {

$pagenumber++;
}

}

// получает все результаты и печатает их

print "<table>
<tr>
<td>pagenumber</td>
<td>fnames</td>
<td>lnames</td>
<td>phone</td>
<td>ad</td>
<td>apt</td>
<td>country</td>
<td>city</td>
<td>zip</td>
<td>email</td>
</tr>\n";

foreach ($stack as $val) {
    print "<tr>\n";
    foreach ($val as $no) {
       print " <td>$no</td>\n";}
 print "</tr>\n"; 
}
print "</table>";
?>

1 Ответ

1 голос
/ 12 октября 2011

В приведенном ниже примере кода есть 2 регулярных выражения.
- 1) $rxtable получает соответствующую таблицу в вашу таблицу $ table1.
- 2) $rxdata извлекает данные (в любом порядке) в(?<named>.*?) захват буфера.
Если вы не хотите именованные буферы, просто замените его на (.*?), он сохраняет порядок захвата.

Регулярные выражения (1 и 2) должны иметь модификатор / s (не игнорировать новые строки)
Кроме того, регулярные выражения (2) должны иметь модификатор / x (расширенный)
(см. Примеркод)

Если у вас есть какие-либо вопросы, дайте мне знать.

Тест (в Perl):

use strict;
use warnings;

my $rxtable = '>Details<(.*?)</table\s*>';

my $rxdata = '

(?=.* <th.*?>\s*Name:\s*</th\s*>\s*
      <td.*?>\s*(?<fname>.*?)\s*<br.*?>\s*(?<lname>.*?)\s*</td\s*>
)
(?=.* <th.*?>\s*Phone:\s*</th\s*>\s*
      <td.*?>\s*(?<phone>.*?)\s*</td\s*>
)
(?=.* <th.*?>\s*Address:\s*</th\s*>\s*
      <td.*?>\s*(?<ad>.*?)\s*</td\s*>
)
(?=.* <th.*?>\s*Apt:\s*</th\s*>\s*
      <td.*?>\s*(?<apt>.*?)\s*</td\s*>
)
(?=.* <th.*?>\s*Country:\s*</th\s*>\s*
      <td.*?>\s*(?<country>.*?)\s*</td\s*>
)
(?=.* <th.*?>\s*City:\s*<br.*?>\s*State/Province:\s*</th\s*>\s*
      <td.*?>\s*(?<city>.*?)\s*</td\s*>
)
(?=.* <th.*?>\s*Zip:\s*</th\s*>\s*
      <td.*?>\s*(?<zip>.*?)\s*</td\s*>
)
(?=.* <th.*?>\s*email:\s*</th\s*>\s*
      <td.*?>\s*(?<email>.*?)\s*</td\s*>
)
';


$/ = undef;

my $html = <DATA>;
my $table;

if ($html =~ /$rxtable/xs) {
    $table = $1;
}

if ($table =~ /$rxdata/xs) {

    print "first name  '$+{fname}'\n";
    print "last name   '$+{lname}'\n";
    print "phone       '$+{phone}'\n";
    print "address     '$+{ad}'\n";
    print "apt         '$+{apt}'\n";
    print "country     '$+{country}'\n";
    print "city        '$+{city}'\n";
    print "zip         '$+{zip}'\n";
    print "email       '$+{email}'\n";

    print "-----------------------\n";
    print "first name  '$1'\n";
    print "last name   '$2'\n";
    print "phone       '$3'\n";
    print "address     '$4'\n";
    print "apt         '$5'\n";
    print "country     '$6'\n";
    print "city        '$7'\n";
    print "zip         '$8'\n";
    print "email       '$9'\n";
}


__DATA__

        <div>
          <div align="center"><a href="frum_search.php">New Search</a></div>
        </div>
    </div>
          <div id="deailspage">
        <div id="det_table">
          <div align="center" class="WADAHeaderText">Details</div>
          <table width="260" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#EEF1F7" class="WADADataTable">
      <tr>
                <th class="WADADataTableHeader"> Name:</th>
                <td class="WADADataTableCell">Menachem<br />

                  Atlman</td>
            </tr>

              <tr>
                <th class="WADADataTableHeader">Phone:</th>
                <td class="WADADataTableCell">02-651-8139</td>
              </tr>
              <tr>
                <th class="WADADataTableHeader">Address:</th>
                <td class="WADADataTableCell">8 Mishkalov</td>
              </tr>
              <tr>
                <th class="WADADataTableHeader">Apt:</th>
                <td class="WADADataTableCell"></td>
              </tr>

              <tr>
                <th class="WADADataTableHeader">City:<br /> 
                State/Province:</th>
                <td class="WADADataTableCell">Har Nof Jerusalem</td>
              </tr>

              <tr>
                <th class="WADADataTableHeader">Country:</th>
                <td class="WADADataTableCell">Israel</td>
              </tr>

              <tr>
                <th class="WADADataTableHeader">Zip:</th>
                <td class="WADADataTableCell"></td>
              </tr>
              <tr>
                <th class="WADADataTableHeader">email:</th>
                <td class="WADADataTableCell"></td>
              </tr>
          </table>

Выход:

first name  'Menachem'
last name   'Atlman'
phone       '02-651-8139'
address     '8 Mishkalov'
apt         ''
country     'Israel'
city        'Har Nof Jerusalem'
zip         ''
email       ''
-----------------------
first name  'Menachem'
last name   'Atlman'
phone       '02-651-8139'
address     '8 Mishkalov'
apt         ''
country     'Israel'
city        'Har Nof Jerusalem'
zip         ''
email       ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...