how to optimize. speed up this php function - php

there are three PHP functions I need to optimize this code, speedup, please helpme
this all functions I use for PHP classified site,
brandwords - is to give more details if some one enter brands
clean_url - is for clean unwanted characters from URL , all
clean_title - is for clean unwanted characters from Title , all
function brandwords( $in ) {
$wordToFind = array(
'suzuki' => 'Suzuki' ,
'Toyota' => 'Toyota',
-------------------------------- big database.
);
$words = preg_split('/\s+/', remove_numbers(strtolower(trim($in))));
foreach ( $wordToFind as $key => $value ) {
if ( ( $pos = array_search( strtolower( $key ), $words ) ) !== FALSE ) {
return $value;
exit();
}
-----------------------------------------------------------------------
function clean_url( $text ) {
$text = strtolower( trim( $text ) );
$code_entities_match = array(' ','--','"','!','#','#','$','%','^','&','*','(',')','_','+','{','}','|',':','"','<','>','?','[',']','\\',';',"'",',','.','/','*','+','~','`','=');
$code_entities_replace = array('-','-','','','','','','','','','','','','','','','','','','','','','','','','');
$text = str_replace($code_entities_match, $code_entities_replace, $text);
$text = str_replace('/[^a-zA-Z0-9\-]/', '-', $text);
$text = str_replace('/^[\-]+/', '', $text);
$text = str_replace('/[\-]+$/', '', $text);
$text = str_replace('/[\-]{2,}/', '-', $text);
$code_entities_match1 = array('--','---','----');
$code_entities_replace1 = array('-','-','-');
$text = str_replace($code_entities_match1, $code_entities_replace1, $text);
return $text;
//$text2 = ucfirst(str_replace('-',' ',$text1));
}
----------------------------------------------------------------
function clean_title( $text ) {
$text = strtolower( trim( $text ) );
$code_entities_match = array(' ','--','"','!','#','#','$','%','^','&','*','(',')','_','+','{','}','|',':','"','<','>','?','[',']','\\',';',"'",',','.','/','*','+','~','`','=');
$code_entities_replace = array('-','-','','','','','','','','','','','','','','','','','','','','','','','','');
$text = str_replace($code_entities_match, $code_entities_replace, $text);
$text = str_replace('/[^a-zA-Z0-9\-]/', '-', $text);
$text = str_replace('/^[\-]+/', '', $text);
$text = str_replace('/[\-]+$/', '', $text);
$text = str_replace('/[\-]{2,}/', '-', $text);
$code_entities_match1 = array('--','---','----');
$code_entities_replace1 = array('-','-','-');
$text = str_replace($code_entities_match1, $code_entities_replace1, $text);
$text = ucfirst(str_replace('-',' ',$text));
return $text;
}
-------------------------------------------------------------
function clean_desc( $text ) {
$text = strtolower( trim( $text ) );
$code_entities_match = array('.','/','\r','\n',' ','--','"','!','#','#','$','%','^','&','*','(',')','_','+','{','}','|',':','"','<','>','?','[',']','\\',';',"'",'.','/','*','+','~','`','=');
$code_entities_replace = array(' ',' ',' ',' ','-','-',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','-','-',' ',' ',' ',' ',' ');
$text = str_replace($code_entities_match, $code_entities_replace, $text);
$text = str_replace('/[^a-zA-Z0-9\-]/', '-', $text);
$text = str_replace('/^[\-]+/', '', $text);
$text = str_replace('/[\-]+$/', '', $text);
$text = str_replace('/[\-]{2,}/', '-', $text);
//$text = preg_replace("'\b[a-z0-9]{1,3}\b'i",' ',$text);
$code_entities_match1 = array('--','---','----');
$code_entities_replace1 = array('-','-','-');
$text = str_replace($code_entities_match1, $code_entities_replace1, $text);
$text = ucfirst(str_replace('-',' ',$text));
return $text;
}

Related

Slug function removing letters with url accent

The function below is working, but I can not understand the reason for being switched by excluding letters that have special characters:
function slug( $string, $separator = '-' ) {
$accents_regex = '~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i';
$special_cases = array( '&' => 'and', "'" => '');
$string = mb_strtolower( trim( $string ), 'UTF-8' );
$string = str_replace( array_keys($special_cases), array_values( $special_cases), $string );
$string = preg_replace( $accents_regex, '$1', htmlentities( $string, ENT_QUOTES, 'UTF-8' ) );
$string = preg_replace("/\s+/", "$separator", $string);
$string = preg_replace("/[$separator]+/u", "$separator", $string);
return $string;
}
example:
the string: "um rádio bonito"
the result should be: "um-radio-bonito"
but the result is: "um-rdio-bonito"
This function can help you
function cleanAccents($r)
{
$r = preg_replace("/ß/","ss", $r);
$r = preg_replace("/[àáâãäå]/","a", $r);
$r = preg_replace("/æ/","ae", $r);
$r = preg_replace("/ç/","c", $r);
$r = preg_replace("/[èéêë]/","e", $r);
$r = preg_replace("/[ìíîï]/","i", $r);
$r = preg_replace("/ñ/","n", $r);
$r = preg_replace("/[òóôõö]/","o", $r);
$r = preg_replace("/œ/","oe", $r);
$r = preg_replace("/[ùúûü]/","u", $r);
$r = preg_replace("/[ýÿ]/","y", $r);
return $r;
}

Generate slug with german umlauts

I try to generate a slug from a string, but I got some problems with the german umlauts:
$text = 'Ein schöner Text';
$text = preg_replace('~[^\\pL\d]+~u', '-', $text);
$text = trim($text, '-');
$text = iconv('utf-8', 'ASCII//TRANSLIT', $text);
$text = strtolower($text);
$text = preg_replace('~[^-\w]+~', '', $text);
The result should be: 'ein-schoener-text'
Change the second preg_replace line to the below because to match any letter in any language you need to use \p{L} pattern.
$text = preg_replace('~[^\p{L}\d]+~u', '-', $text);
Code:
<?php
$text = 'Ein schöner Text';
$text = preg_replace('~[^\p{L}\d]+~u', '-', $text);
$text = trim($text, '-');
$text = iconv('utf-8', 'ASCII//TRANSLIT', $text);
$text = strtolower($text);
$text = preg_replace('~[^-\w]+~', '', $text);
echo $text;
?>
Output:
ein-schoner-text

How to hide text between multiple <> // [] **

I use this code and all is ok, it hide text from $comments contains between [], but i want to hide text from other symbols for. ex. ** && ^^ $$ ## // <>. What i need to add here, to have INSTEAD OF
Date <20.02.2013> Time [11-00] Name #John#
Have this:
Date Time Name
?
function replaceTags($startPoint, $endPoint, $newText, $source) {
return preg_replace('#('.preg_quote($startPoint).')(.*)('.preg_quote($endPoint).')#si', '$1'.$newText.'$3', $source);
}
$source= $comments;
$startPoint='[';
$endPoint=']';
$newText='';
echo replaceTags($startPoint, $endPoint, $newText, $source);
You just need to change
$startPoint='[';
$endPoint=']';
to
$startPoint='<';
$endPoint='>';
To do multiple symbols you can do multiple calls to the function, like this:
$source= $comments;
$newText='';
$str = replaceTags('[', ']', $newText, $source);
$str = replaceTags('<', '>', $newText, $str);
$str = replaceTags('*', '*', $newText, $str);
$str = replaceTags('&', '&', $newText, $str);
$str = replaceTags('^', '^', $newText, $str);
$str = replaceTags('$', '$', $newText, $str);
$str = preg_replace("/\#[^#]+#)/","",$str);
$str = replaceTags('/', '/', $newText, $str);
// add more here
echo $str;
You will have to create patterns for each pair:
$pairs = array(
'*' => '*',
'&' => '&',
'^' => '^',
'$' => '$',
'#' => '#',
'/' => '/',
'[' => ']', // this
'<' => '>', // and this pairs differently from the rest
);
$patterns = array();
foreach ($pairs as $start => $end) {
$start = preg_quote($start, '/');
$end = preg_quote($end, '/');
$patterns[] = "/($start)[^$end]*($end)/";
}
echo preg_replace($patterns, '', $s), PHP_EOL;
// not sure what you want here
//  echo preg_replace($patterns, '$1' . $newText . '$2', $s), PHP_EOL;

str_replace between two numerical strings

Another problem with str_replace, I would like to change the following $title data into URL by taking the $string between number in the beginning and after dash (-)
Chicago's Public Schools - $10.3M
New Jersey - $3M
Michigan: Public Health - $1M
The desire output is:
chicago-public-school
new-jersey
michigan-public-health
PHP code I am using
$title = ucwords(strtolower(strip_tags(str_replace("1: ", "", $title))));
$x = 1;
while ($x <= 10) {
$title = ucwords(strtolower(strip_tags(str_replace("$x: ", "", $title))));
$x++;
}
$link = preg_replace('/[<>()!#?:.$%\^&=+~`*é"\']/', '', $title);
$money = str_replace(" ", "-", $link);
$link = explode(" - ", $link);
$link = preg_replace(" (\(.*?\))", "", $link[0]);
$amount = preg_replace(" (\(.*?\))", "", $link[1]);
$code_entities_match = array(''s', '"', '!', '#', '#', '$', '%', '^', '&', '*', '(', ')', '+', '{', '}', '|', ':', '"', '<', '>', '?', '[', ']', '', ';', "'", ',', '.', '_', '/', '*', '+', '~', '`', '=', ' ', '---', '--', '--');
$code_entities_replace = array('', '-', '-', '', '', '', '-', '-', '', '', '', '', '', '', '', '-', '', '', '', '', '', '', '', '', '', '-', '', '-', '-', '', '', '', '', '', '-', '-', '-', '-');
$link = str_replace($code_entities_match, $code_entities_replace, $link);
$link = strtolower($link);
Unfortunately the result I got:
-chicagoamp9s-public-school
2-new-jersey
3-michigan-public-health
Anyone has a better solution for this? Thanks guys!
(the ' changed into amp9 - wonder why?)
If I understand you correctly:
if (preg_match('!\d+:\s+(.*)\s+-\s+\$\d+(?:\.\d+)?!', $title, $groups)) {
$words = strip_tags(strtolower($groups[1]));
$words = preg_replace('\[^\s\w]!', '', $words);
$words = preg_replace('!\s+!', '-', $words);
$words = preg_replace('!-+!', '-', $words);
echo $words;
}
One thing: your text has "1. Chicago's..." not "1: ..." like your code would seem to suggest. Is one an error or is there something else going on?
You can do:
$str = "1. Chicago's Public Schools - $10.3M";
$from = array('/^\d+\.\s+([^-]*) -.*$/','/[^A-Z ]/i','/\s+/');
$to = array("$1",'','-');
$str = strtolower(preg_replace($from,$to,$str));
echo $str; // prints chicagos-public-schools
<?php
$lines = array("1. Chicago's Public Schools - $10.3M",
"2. New Jersey - $3M",
"3. Michigan: Public Health - $1M"
);
// remove the number bullets
$lines = preg_replace('/\ - \$\d*\.?\d*M$/', '', $lines);
// remove the trailing dollar amount
$lines = preg_replace('/^\d+\.\ /', '', $lines);
// remove ignore chars
$ignore_pattern = "/['s|:]/";
$lines = preg_replace($ignore_pattern, '', $lines);
for ($i=0; $i<count($lines); $i++) {
$lines[$i] = implode('-',explode(' ', strtolower(trim($lines[$i]))));
}
print_r($lines);
and the output:
Array
(
[0] => chicago-public-school
[1] => new-jerey
[2] => michigan-public-health
)
EDIT Start:
<?php
$lines = array("1. Chicago's Public Schools - $10.3M",
"2. New Jersey - $3M",
"3. Michigan: Public Health - $1M",
"4. New York's Starbucks - $2M",
);
$lines = preg_replace('/\ - \$\d*\.?\d*M$/', '', $lines);
$lines = preg_replace('/^\d+\.\ /', '', $lines);
$ignore_strings = array("'s", ':');
for ($i=0; $i<count($lines); $i++) {
foreach ($ignore_strings as $s) {
$lines[$i] = str_replace($ignore_strings, '', $lines[$i]);
}
}
for ($i=0; $i<count($lines); $i++) {
$lines[$i] = implode('-',explode(' ', strtolower(trim($lines[$i]))));
}
print_r($lines);
output:
Array
(
[0] => chicago-public-schools
[1] => new-jersey
[2] => michigan-public-health
[3] => new-york-starbucks
)
Hope it meets your needs.
EDIT End.
Assuming you already have extracted titles correctly like "Chicago's Public Schools", then to generate pagenames out of them:
function generatePagename($s) {
//to lower
$pagename = trim(html_entity_decode(strtolower($s), ENT_QUOTES));
//remove 's
$pagename = trim(preg_replace("/(\'s)/", "", $pagename));
//replace special chars with spaces
$pagename = trim(preg_replace("/[^a-z0-9\s]/", " ", $pagename));
//replace spaces with dashes
$pagename = trim(preg_replace("/\s+/", "-", $pagename));
return $pagename;
}
Which will convert something like
Chicago's "Public": Scho-ols1+23
to
chicago-public-scho-ols1-23.
Finally I looked back to initial code and have some fixes:
$title = ucwords(strtolower(strip_tags(str_replace("1. ","",$title))));
$x=1;
while($x <= 10) {
$title = ucwords(strtolower(strip_tags(str_replace("$x. ","",$title))));
$x++;
}
$data = preg_replace('/[<>()!#?:.$%\^&=+~`*&#;"\']/', '',$title);
$urldata = str_replace(" ","-",$data);
$data = explode(" - ",$data);
$link = preg_replace(" (\(.*?\))", "", $data[0]);
$budget = preg_replace(" (\(.*?\))", "", $data[1]);
$code_entities_match = array( '"' ,'!' ,'#' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'+' ,'{' ,'}' ,'|' ,':' ,'"' ,'<' ,'>' ,'?' ,'[' ,']' ,'' ,';' ,"'" ,',' ,'.' ,'_' ,'/' ,'*' ,'+' ,'~' ,'`' ,'=' ,' ' ,'---' ,'--','--');
$code_entities_replace = array('' ,'-' ,'-' ,'' ,'' ,'' ,'-' ,'-' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'-' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'-' ,'' ,'-' ,'-' ,'' ,'' ,'' ,'' ,'' ,'-' ,'-' ,'-','-');
$link = str_replace($code_entities_match, $code_entities_replace, $link);
$link = strip_tags(str_replace("amp39s","",$link));
$link = strtolower($link);
What a mess, I know, but it works anyway, thanks guys for helping me, especially cletus who found the mistake between 1. and 1:

How to remove all special characters from URL?

I have my class
public function convert( $title )
{
$nameout = strtolower( $title );
$nameout = str_replace(' ', '-', $nameout );
$nameout = str_replace('.', '', $nameout);
$nameout = str_replace('æ', 'ae', $nameout);
$nameout = str_replace('ø', 'oe', $nameout);
$nameout = str_replace('å', 'aa', $nameout);
$nameout = str_replace('(', '', $nameout);
$nameout = str_replace(')', '', $nameout);
$nameout = preg_replace("[^a-z0-9-]", "", $nameout);
return $nameout;
}
BUt I can't get it to work when I use special characters like ö and ü and other, can sombody help me here? I use PHP 5.3.
The first answer in this SO thread contains the code you need to do this.
And what about:
<?php
$query_string = 'foo=' . urlencode($foo) . '&bar=' . urlencode($bar);
echo '<a href="mycgi?' . htmlentities($query_string) . '">';
?>
From: http://php.net/manual/en/function.urlencode.php
I wrote this function a while ago for a project I was working on and couldn't get RegEx to work. Its not the best way, but it works.
function safeURL($input){
$input = strtolower($input);
for($i = 0; $i < strlen($input); $i++){
$working = ord(substr($input,$i,1));
if(($working>=97)&&($working<=122)){
//a-z
$out = $out . chr($working);
} elseif(($working>=48)&&($working<=57)){
//0-9
$out = $out . chr($working);
} elseif($working==46){
//.
$out = $out . chr($working);
} elseif($working==45){
//-
$out = $out . chr($working);
}
}
return $out;
}
Here's a function to help with what you're doing, it's written in
Czech: http://php.vrana.cz/vytvoreni-pratelskeho-url.php
(and translated to English)
Here's another take on it (from the Symfony documentation):
<?php
function slugify($text)
{
// replace non letter or digits by -
$text = preg_replace('~[^\\pL\d]+~u', '-', $text);
// trim
$text = trim($text, '-');
// transliterate
if (function_exists('iconv'))
{
$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
}
// lowercase
$text = strtolower($text);
// remove unwanted characters
$text = preg_replace('~[^-\w]+~', '', $text);
if (empty($text))
{
return 'n-a';
}
return $text;
}

Categories