We have a url pattern of [node:menu-link:parents:join-path]/[node:title].

We are finding that it is resulting in the following urls and we wanted to see if we could use hook_pathauto_alias_alter to remove the undesired string. We are finding that when doing the preg_replace, that is removing all instances where the "/" is found. We just want to remove the string upto the first "/" character. Need assistance in figuring out why it is not working.

function mymodule_pathauto_alias_alter(&$alias, array &$context) {
       $patt = '.+(\/)';
       $replacement = '';
       preg_replace($patt, $replace);

Current results:

  • some-text/menu-linka/menu-linkb
  • some-text/menu-linka/menu-linkb/menu-linkc

Desired results:

  • menu-linka/menu-linkb
  • menu-linka/menu-linkb/menu-linkc

2 Answers 2


I see many problems in the code you posted in your question. First of all, you are missing a parameter in preg_replace. Take a look at the PHP documentation.

Second, you have no delimiters in your pattern. The correct pattern should be:

$patt = '/.+\//';

(You don't need the parenthesis, but you do need delimiters such as slash bars. See this).

Third, preg_replace() returns an array with the replacement. You need to assign the result to $alias, as in $alias = preg_replace(...)

I have not use this hook before, but keep in mind (from the description) that this is only invoked before the alias is saved.


you can handle this with global redirect module, it is useful module that could handle what you want and give your some ability to improve your site SEO.

GlobalRedirect is a simple module which…

Checks the current URL for an alias and does a 301 redirect to it if it is not being used.
Checks the current URL for a trailing slash, removes it if present and repeats check 1 with the new request.
Checks if the current URL is the same as the site_frontpage and redirects to the frontpage if there is a match.
Checks if the Clean URLs feature is enabled and then checks the current URL is being accessed using the clean method rather than the

'unclean' method. Checks access to the URL. If the user does not have access to the path, then no redirects are done. This helps avoid exposing private aliased node's. Make sure the case of the URL being accessed is the same as the one set by the author/administrator. For example, if you set the alias "articles/cake-making" to node/123, then the user can access the alias with any combination of case. Most of the above options are configurable in the settings page. In Drupal 5 you can access this after enabling the globalredirect_admin module. In Drupal 6, the settings page is bundled into the module.

Not the answer you're looking for? Browse other questions tagged or ask your own question.