473,395 Members | 2,796 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

Problem with mod_rewrite and replacing spaces in URL

Sent this to alt.php a couple of days back, but doesn't look like I'll
get an answer, so trying here.

I'm trying to convert a script to use friendly URLs, I've done this
before, but my PHP skills are quite basic so far, far from proficient
at this.

..htaccess file-

DirectoryIndex default.php index.asp index.html index.htm index.php

Options +FollowSymLinks
RewriteEngine on

RewriteRule ^([^/]+)/Artist/([^/]+)/$ search.php?typ=$1&search=$2 [L]
RewriteRule ^([^/]+)/Artist/([^/]+)/([^/]+)/$
search.php?typ=$1&search=$2&page=$3 [L]

RewriteRule ^([^/]+)/$ default.php?typ=$1 [L]
RewriteRule ^([^/]+)/([^/]+)/$ default.php?typ=$1&page=$2 [L]

RewriteRule ^([^/]+)/([^/]+)/$ default.php?typ=$1&cat=$2 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$
default.php?typ=$1&cat=$2&page=$3 [L]

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$
default.php?typ=$1&cat=$2&sct=$3 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/$
default.php?typ=$1&cat=$2&sct=$3&page=$4 [L]

Each set of rules creates these URLs-

example.com/$1/Artist/$2/
example.com/$1/Artist/$2/$3/ ($3 is a page number)

example.com/$1/
example.com/$1/$2/ ($2 is a page number)

example.com/$1/$2/
example.com/$1/$2/$3/ ($3 is a page number)

example.com/$1/$2/$3/
example.com/$1/$2/$3/$4/ ($4 is a page number)

It works.

However when variable $2 or $3 (when not a page number), for example
$2 of-

example.com/$1/Artist/$2/
example.com/$1/Artist/$2/$3/ ($3 is a page number)

Includes a space I can't get the PHP script to create an hyphenated
version that works even though at browser level the hyphen is there
(click on it, but the right page does not load).

So a starting URL like

example.com/ringtone/Artist/Britney%20Spears/ (works)

Converted to-

example.com/ringtone/Artist/Britney-Spears/ (doesn't work)

Using a function (see later) that converts spaces to hyphens doesn't
load what I see at example.com/ringtone/Artist/Britney%20Spears/
instead I see a 404 error page (blank script page) and I don't
understand why (I've used the function before)

Using urlencode instead of the function replaces spaces with + so I
see

example.com/ringtone/Artist/Britney+Spears/ (works)

but it's not the format I want and there are other characters I'd like
to remove including ( ) ! &.

So what is wrong with this function (which I don't fully understand
BTW)-

function text2url( $string ){
$string = ltrim($string);
// remove unnecessary spaces and make everything lower case
$string = preg_replace( "/ +/", " ", strtolower($string) );

// special rule for dashes, I think it looks nicer :-p
$string = str_replace(' - ', '-', $string);
// removing a set of reserved characters (rfc2396: ; / ? : @ & = + $
,)
$string =
str_replace(array(';','/','?',':','@','&','=','+','$',',','#'), '',
$string);

// replace some characters to similar ones (more readable uris)
$search = array(' ', 'ä', 'ö', 'ü','ë','ï','é','è','à','ç',);
#$replace = array('_','ae','oe','ue','e','i','e','e','a','c');
$replace = array('-','ae','oe','ue','e','i','e','e','a','c');
$string = str_replace($search, $replace, $string);

// remove everything we didn't so far...
$string = preg_replace("/[^a-z0-9_-]/", "", $string);

// urlencode everything, in case we missed something ;-)
return urlencode($string);
}

When I use it like this

$artist2 = text2url($artist);

echo'<a href="'.$site_url.''.$typ.'/Artist/'.$artist2.'/1/"><img
src="'.$site_url.'button_more_from.gif" alt="All Truetones from
'.$artist.'" border="0"></a>'.$artist.' ';
It converts spaces to hyphens, but within a browser it fails.
This works but adds +

echo'<a
href="'.$site_url.''.$typ.'/Artist/'.urlencode($artist).'/1/"><img
src="'.$site_url.'button_more_from.gif" alt="All Truetones from
'.$artist.'" border="0"></a>'.$artist.'';
Thanks in advance for any help as I'm stumped.

David
--
SEO Tutorial http://www.seo-gold.com/tutorial/
More Earnings Blog http://www.morearnings.com/
Oct 17 '06 #1
2 6518
David wrote:
Sent this to alt.php a couple of days back, but doesn't look like I'll
get an answer, so trying here.

I'm trying to convert a script to use friendly URLs, I've done this
before, but my PHP skills are quite basic so far, far from proficient
at this.

<snip>

One thing I immediately noticed: your text2url function lowercases
everything, but your Britney Spears example is capitalized.

At a more fundamental level, how are you using the URL to lookup the
artists themselves? This is where the problem lies. You are going to
have to do the same transformation to the artist name when looking up
the artist that you did when creating the friendly URL.

For example, here is a simple scheme which lowercases the URL and
replaces spaces with dashes, and the corresponding database lookup.

..htaccess:
-----------------------------------------
RewriteRule ^artists/([^/]+) /artists.php?artistName=$1
-----------------------------------------
URL creation:
-------------------------------------------
$url = "/artists/" . strtolower(str_replace(" ", "-", $artistName));
-------------------------------------------
Artist lookup (assumes PDO/PGSQL):
------------------------------------
$artist_query = $pdo->prepare("select * from artists where
LOWER(REPLACE(artist_name, ' ', '-')) = :artistName");

$artist_query->bindParam(":artistName", $_GET["artistName"]);
$artist_query->execute();
$artist = $artist_query->fetch();
-----------------------------

This code will obviously not work verbatim; it's just an example of how
you need perform the same transformation on artist names when you're
looking them up, or the comparison won't work. Notice how in my SQL
query I'm comparing the passed-in artist name (in the form of
"britney-spears") with the artist name in the database (in the form of
"Britney Spears") only AFTER I transform the database version to the
proper format - LOWER(REPLACE(...)) transforms "Britney Spears" to
"britney-spears", making the comparison successful.

Jeremy
Oct 17 '06 #2
On Tue, 17 Oct 2006 11:55:44 -0700, Jeremy <je****@pinacol.comwrote:
>David wrote:
>Sent this to alt.php a couple of days back, but doesn't look like I'll
get an answer, so trying here.

I'm trying to convert a script to use friendly URLs, I've done this
before, but my PHP skills are quite basic so far, far from proficient
at this.

<snip>


One thing I immediately noticed: your text2url function lowercases
everything, but your Britney Spears example is capitalized.
I'd tried it with and without lowercase, so that wasn't a major
problem. Don't mind if the URls have upper case characters.
>At a more fundamental level, how are you using the URL to lookup the
artists themselves? This is where the problem lies. You are going to
have to do the same transformation to the artist name when looking up
the artist that you did when creating the friendly URL.

For example, here is a simple scheme which lowercases the URL and
replaces spaces with dashes, and the corresponding database lookup.

.htaccess:
-----------------------------------------
RewriteRule ^artists/([^/]+) /artists.php?artistName=$1
-----------------------------------------
URL creation:
-------------------------------------------
$url = "/artists/" . strtolower(str_replace(" ", "-", $artistName));
-------------------------------------------
I've tried similar and it's worked fine with other sites, just this
one fails!

Tried a simpler function-

function safeurl($name){
$retVal = str_replace('/',' ',$name);
$retVal = str_replace('-',' ',$retVal);
return $retVal;
}
To replace a / with a space and spaces with a -

Example code-
$viewart = '<div style="clear:both; text-align:right;
padding-right:15px;">
<h4>View All <a
href="'.$site_url.''.safeurl($typ).'/Artist/'.safeurl($artist).'/1/">Polyphonic
Ringtones by '.$artist.'</a></h4>
</div>';
}
?>

<?php echo''.$viewart.'';?>
It works at code level, the \ and spaces are removed/replaced with -
when viewed in a browser but when clicking links they fail.
This code on the other hand works fine-

$viewart = '<div style="clear:both; text-align:right;
padding-right:15px;">
<h4>View All <a
href="'.$site_url.''.urlencode($typ).'/Artist/'.urlencode($artist).'/1/">Polyphonic
Ringtones by '.$artist.'</a></h4>
</div>';
}
?>

<?php echo''.$viewart.'';?>
This as expected replaces spaces with a + and characters like / are
replaced with %2F etc... the + URLs work but the / and some other
characters don't, so partial success.

I don't understand why the function fails?
>
Artist lookup (assumes PDO/PGSQL):
------------------------------------
$artist_query = $pdo->prepare("select * from artists where
LOWER(REPLACE(artist_name, ' ', '-')) = :artistName");

$artist_query->bindParam(":artistName", $_GET["artistName"]);
$artist_query->execute();
$artist = $artist_query->fetch();
-----------------------------
Does it make any difference that most of the data is from a CSV file
(no database)?

The code to get data is-

$row=0;
$file = fopen("$filepath", "r");

while (($data = fgetcsv($file, 1000, ";")) !== FALSE) {
if ($sct==''){
if ($data[$DATA["typ"]]==$typ and $data[$DATA["cat"]]==$cat or
$data[$DATA["typ"]]==$typ and $cat==''){

$row++;

$nam[$row] = $data[$DATA["nam"]];
$dsc[$row] = $data[$DATA["dsc"]];
$dsl[$row] = $data[$DATA["dsl"]];
$pth[$row] = $data[$DATA["pth"]];
$ppl[$row] = $data[$DATA["ppl"]];

} }

if ($sct>''){
if ($data[$DATA["typ"]]==$typ and $data[$DATA["cat"]]==$cat and
$data[$DATA["sct"]]==$sct){

$row++;

$nam[$row] = $data[$DATA["nam"]];
$dsc[$row] = $data[$DATA["dsc"]];
$dsl[$row] = $data[$DATA["dsl"]];
$pth[$row] = $data[$DATA["pth"]];
$ppl[$row] = $data[$DATA["ppl"]];

} }
}
fclose($file);

First time I've worked with a site using a CSV file.

Should I be replacing the spaces etc... in this code somehow?
>This code will obviously not work verbatim; it's just an example of how
you need perform the same transformation on artist names when you're
looking them up, or the comparison won't work. Notice how in my SQL
query I'm comparing the passed-in artist name (in the form of
"britney-spears") with the artist name in the database (in the form of
"Britney Spears") only AFTER I transform the database version to the
proper format - LOWER(REPLACE(...)) transforms "Britney Spears" to
"britney-spears", making the comparison successful.
I tried variations of your code, but couldn't get anything to work.
>Jeremy
Thanks very much for the advice so far, appreciated.

David
--
Free Search Engine Optimization Tutorial
http://www.seo-gold.com/tutorial/
Oct 18 '06 #3

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Westcoast Sheri | last post by:
Hello. How do I do this: If a visitor types in any number after my url, I want mod_rewrite to convert it to my url/anotherpage.html?number=number_visitor_typed Example: ...
4
by: Support | last post by:
Hello, I am running RedHat & Apache. RedHat does not allow creating more that 32000 subdirectories in one folder due to #defined constant limitation in the core code. I need to display 47000...
2
by: Philo Hippo | last post by:
Hi, I need to be able to remove spaces from the beginning or the end of a string. This is my very 1st attempt at doing that in JS and here is what i got: function SearchForDomains(winName,...
8
by: Andrew McNab | last post by:
Hi folks, I have a problem with an MS Access SQL query which is being used in an Access Report, and am wondering if anyone can help. Basically, my query (shown below) gets some records from a...
11
by: joelbyrd | last post by:
I have a people-networking type site in which each user has their own profile page, with their user id encoded. So, for example, the web address of their page might look like...
5
by: Fred.Grieco | last post by:
Hi every body, I have a little pb and I'm turning around : function MyFCTN(var1,var2) { var mytable = document.getElementById("myTBL"); for (var i=myTBL.childNodes.length-1; i>0; i--){...
3
by: Rik G. | last post by:
I'm trying to replace a PHP query string with virtual directories using Apache's mod_rewrite. Here's my test .htaccess: RewriteEngine on RewriteRule ^qqq$ database.php?cat=0 RewriteRule...
10
by: Adrian Smith | last post by:
This may be more a cgi thing than a Python one, but I'm trying to get this page: http://adrian10.phpwebhosting.com/trial.html consisting basically of this: <FORM...
7
by: Dale | last post by:
again, i know this is OT...just move along to the next post if it bugs you. :) i had been trying to have this: project.66.204.32.110 from the client browser, map to a virtual host where the...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.